1

我想在我的 MVC 视图中将自定义渲染器定义为 lambda,我可以在部分中使用它来多次渲染相同的东西。我计划将其存储在视图数据中。到目前为止,我已经创建了这个扩展方法来存储渲染器:

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

我试图在我的视图中定义渲染器,但它不起作用;我假设我的语法是关闭的。有人可以告诉我我在这里做错了什么吗?我只希望它在调用时呈现测试段落:

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

3 回答 3

1

-DefineRenderer方法需要返回除 void 之外的任何内容,例如IHtmlString使用 razor @-syntax 调用它,否则您需要像这样调用它:

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

编辑:对不起,我看到renderer参数是 type System.Action。我认为它必须是类型System.Func<dynamic, HelperResult>,您需要调用它

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

例如。然后你可以像这样渲染它render(null).ToHtmlString():无论如何请注意,如果您在视图中执行此类操作,您可能会遇到部分视图缓存问题。

于 2013-03-12T13:49:28.013 回答
0

我仍然不能 100% 确定这是否是您需要的,但也许它会有所帮助。在局部视图中定义 @helper 并根据 Model 的值决定要渲染的版本:

在代码中使用标头类型声明枚举

public enum HeaderTypes
{
    AnalysisTable,
    SomethingElse
}

那么在你看来

@helper RenderHeader(HeaderTypes headerType) {
    switch (headerType)
    {
        case HeaderTypes.AnalysisTable:
            @: <p>your html</p>
            break;
        default: 
            @: <p>default</p>
            break;
    }
}

@RenderHeader(HeaderTypes.None)
@RenderHeader(HeaderTypes.AnalysisTable)

或者您可以根据字符串值或其他内容进行切换。

于 2013-03-12T15:10:16.813 回答
0

从@mariozski 的评论中得到一些启发,我设法获得了我想要工作的行为。我使用 a@helper作为渲染器。我传递给部分的模型包含辅助渲染的结果,即。一个HelperResult。所以它看起来像这样:

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

然后,调用视图像这样调用部分:

@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()
    }
)

最后,部分本身可以像这样多次呈现“标题类型行”:

@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
}
于 2013-03-12T16:23:06.633 回答