我有一个扩展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,我不知道如何做到这一点。有人可以建议吗?
答案 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(); %>