ASP.NET MVC中帮助程序的内联HTML语法

时间:2010-06-07 06:33:18

标签: .net asp.net-mvc asp.net-mvc-2 lambda

我有一个扩展MVC中HtmlHelper的类,允许我使用构建器模式构造特殊输出,例如。

<%=
    Html.FieldBuilder<MyModel>(builder => {
        builder.Field(model => model.PropertyOne);
        builder.Field(model => model.PropertyTwo);
        builder.Field(model => model.PropertyThree);
    })
%>

输出一些特定于应用程序的HTML,简单地说,

<ul>
    <li>PropertyOne: 12</li>
    <li>PropertyTwo: Test</li>
    <li>PropertyThree: true</li>
</ul>

然而,我想要做的是添加一个新的构建器methid来定义一些内联HTML,而不必将其存储为字符串。例如。我想这样做。

<%
    Html.FieldBuilder<MyModel>(builder => {
        builder.Field(model => model.PropertyOne);
        builder.Field(model => model.PropertyTwo);
        builder.ActionField(model => %>
            Generated: <%=DateTime.Now.ToShortDate()%> (<a href="#">Refresh</a>)
        <%);
    }).Render();
%>

并生成此

<ul>
    <li>PropertyOne: 12</li>
    <li>PropertyTwo: Test</li>
    <li>Generated: 29/12/2008 <a href="#">Refresh</a></li>
</ul>

本质上是一个接受HTML块的ActionExpression。但是为了做到这一点,我似乎需要执行表达式,但将块的执行指向我自己的StringWriter,我不知道如何做到这一点。有人可以建议吗?

1 个答案:

答案 0 :(得分:1)

您只需要推迟执行该操作。这是一个例子:

public static class HtmlExtensions
{
    public static SomeClass ActionField<TModel>(this HtmlHelper<TModel> htmlHelper, Action<TModel> action)
    {
        return new SomeClass(() => { action(htmlHelper.ViewData.Model); });
    }
}

public class SomeClass
{
    private readonly Action _renderer;
    public SomeClass(Action renderer)
    {
        _renderer = renderer;
    }

    public void Render()
    {
        _renderer();
    }
}

可以这样使用:

<% Html.ActionField(model => { %>
    Generated: <%=DateTime.Now.ToShortDate()%> (<a href="#">Refresh</a>)
<% }).Render(); %>