2

我已经为 ASP.NET MVC 4 编写了一个分页转发器。它有一个渲染方法,它接受页眉、页脚、正文和分隔符部分的参数来渲染,就像这样(为了便于阅读而简化了很多):

public IHtmlString Render(Func<TViewModel, object> header, Func<TViewModel, object> body, Func<TViewModel, object> footer)
{
    var sb = new StringBuilder();
    // Code to render including calling the parameter objects, something like this:
    sb.Append(header(null));
    foreach (var item in items)
        sb.Append(body(item));
    sb.Append(footer(null));

    return new HtmlString(sb.ToString());
}

现在,我想在 Razor 模板中使用此方法,并包含实际模板部分作为参数。这对于像这样的场景非常有用,我要么只使用纯 lambda 表达式,要么使用 oneliner 作为模板:

@Model.Render(body:
    item => Html.Partial("InvoiceListView", item)
, separator:
    @<hr />
)

但是,如果我想做一些更复杂的事情,比如构建一个表格并填充它,我就是无法让 Razor 意识到我想将这些多行模板作为参数发送。

我想也许这会起作用:

@Model.Render(body: item => 
    @<text>
        <tr>
            <td>
                @item.ArticleNr
            </td>
        </tr>
    </text>
);

但那里没有运气。有人有什么建议吗?还是我运气不好 - 在 Razor 中写这样的中继器是不可能的吗?

4

1 回答 1

1

你可以看看这篇文章:

http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx

希望能帮助到你!

编辑:

您可以使用一些包装器而不是直接使用 lambda 表达式

@helper Foo(object item)
{
    <tr>
        ...
    </tr>
}

@Model.Render(body: Foo)
于 2013-03-26T23:35:14.803 回答