不能定义在MVC定制呈现拉姆达 [英] Can't define a custom renderer lambda in MVC

查看:113
本文介绍了不能定义在MVC定制呈现拉姆达的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要定义一个自定义呈现在我的MVC视图拉姆达,我可以用它在部分多次渲染同样的事情。我打算将其存储在视图中的数据。到目前为止,我已经创造了这个扩展方法来存储渲染:

 公共静态类HtmlHelperExtensions
{
   公共静态无效DefineRenderer<&的TModel GT;(这与的HtmlHelper LT;的TModel> HTML,串rendererName,动作渲染器)
   {
      html.ViewData [_渲染+ rendererName] =渲染器;
   }
}

我想在我看来来定义渲染器,但它不工作;我想我的语法是关闭的。可能有人告诉我,我在做什么错在这里?我只是希望它渲染所谓当测试段落:

  @ Html.DefineRenderer(AnalysisTableHeader,()=> {
    &所述p为H.;试验段&下; / P>
@});


解决方案

通过一些灵感来自@ mariozski的评论,我设法得到我想要工作的行为。我用的是 @helper 作为渲染器。我传递给局部模型包含辅助呈现,即的结果。一个 HelperResult 。所以它看起来是这样的:

 公共类AnalysisResponseTableViewModel {
    公共HelperResult HeaderTypeRowRenderer {搞定;组; }
    公开名单< AnalysisUserResponseViewModel>回应{搞定;组; }
}

然后调用视图调用部分是这样的:

  @helper RenderHeaderTypeRow(){
    &所述; TR类=headerTypeRow>
        < TD>头型排< / TD>
        < TD>去此处< / TD>
    < / TR>
}@ Html.Partial(AnalysisResponseTableContentsPartial
    新AnalysisResponseTableViewModel {
        响应= Model.OverallCaseStudyUserResponses,
        HeaderTypeRowRenderer = RenderHeaderTypeRow()
    }

和最后部分本身可以呈现头类型行多次这样的:

  @ Html.Raw(Model.HeaderTypeRowRenderer.ToHtmlString())
@ {布尔reachedSummaryRows = FALSE;}
@foreach(在Model.Responses VAR响应){
    如果(reachedSummaryRows&安培;!&安培;!response.IsPass.HasValue){
        reachedSummaryRows = TRUE;
        @:@ Html.Raw(Model.HeaderTypeRowRenderer.ToHtmlString())
    }    //其他表在这里行
}

I want to define a custom renderer as a lambda in my MVC view that I can use it in a partial to render the same thing multiple times. I plan to store it in the view data. So far I have created this extension method to store the renderer:

public static class HtmlHelperExtensions
{
   public static void DefineRenderer<TModel>(this HtmlHelper<TModel> html, string rendererName, Action renderer)
   {
      html.ViewData["_Renderer" + rendererName] = renderer;
   }
}

I'm trying to define the renderer in my view, but it isn't working; I assume my syntax is off. Could somebody tell me what I'm doing wrong here? I just want it to render the test paragraph when called:

@Html.DefineRenderer("AnalysisTableHeader", () => {
    <p>test paragraph</p>
@});

解决方案

With some inspiration from @mariozski's comment, I managed to get the behaviour I wanted to work. I use a @helper as the renderer. The model I pass to the partial contains the result of the helper render, ie. a HelperResult. So it looks like this:

public class AnalysisResponseTableViewModel {
    public HelperResult HeaderTypeRowRenderer { get; set; }
    public List<AnalysisUserResponseViewModel> Responses { get; set; }
}

Then, the calling view calls the partial like this:

@helper RenderHeaderTypeRow() {
    <tr class="headerTypeRow">
        <td>Header type row</td>
        <td>Goes here</td>
    </tr>
}

@Html.Partial("AnalysisResponseTableContentsPartial",
    new AnalysisResponseTableViewModel {
        Responses = Model.OverallCaseStudyUserResponses,
        HeaderTypeRowRenderer = RenderHeaderTypeRow()
    }
)

And finally the partial itself can render the 'header type row' multiple times like this:

@Html.Raw(Model.HeaderTypeRowRenderer.ToHtmlString())
@{bool reachedSummaryRows = false;}
@foreach (var response in Model.Responses) {
    if (!reachedSummaryRows && !response.IsPass.HasValue) {
        reachedSummaryRows = true;
        @:@Html.Raw(Model.HeaderTypeRowRenderer.ToHtmlString())
    }

    // other table rows here
}

这篇关于不能定义在MVC定制呈现拉姆达的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆