【问题标题】:Sending HTML blocks as parameters in ASP.NET MVC 4 Razor在 ASP.NET MVC 4 Razor 中将 HTML 块作为参数发送
【发布时间】:2012-11-30 21:45:36
【问题描述】:

我已经为 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 中编写这样的中继器是不可能的?

【问题讨论】:

    标签: asp.net-mvc razor html-helper


    【解决方案1】:

    你可以看看这篇文章:

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

    希望对你有帮助!

    编辑:

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

    @helper Foo(object item)
    {
        <tr>
            ...
        </tr>
    }
    
    @Model.Render(body: Foo)
    

    【讨论】:

    • 实际上,是的,这确实有帮助,而且我很惊讶它确实有效,因为我认为我已经尝试了所有可能的构造变体。一旦我尝试使用命名参数,我的主要问题似乎就出现了。我不知道这是否是因为我需要更改参数的模板定义,或者它只是完全不兼容。但是,如果我省略了命名参数而只使用位置参数,我可以通过在模板前面加上 @ 字符(并且没有 ,如上面的示例)来包含模板。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2014-10-26
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多