我已经创建了一个简单的Gallery html帮助器,它目前还不漂亮,因为我无法使用Razor。 (我本来希望使用Action,就像我对webforms viewengine所做的那样)
public static HelperResult Gallery<T>(this HtmlHelper html,
IEnumerable<T> items,
int itemsPerRow,
Action rowContainer,
Func<T, HelperResult> itemContainer,
Action endRowContainer)
{
if (items == null)
return new HelperResult(writer => { });
int itemCount = 1;
return new HelperResult(writer =>
{
rowContainer();
foreach (var item in items)
{
if (itemCount % itemsPerRow == 0)
{
endRowContainer();
rowContainer();
}
itemContainer(item).WriteTo(writer);
itemCount++;
}
endRowContainer();
});
}
这是有用的用法,但rowContainer和endRowContainer在生成的HTML顶部输出
@Html.Gallery(
Model.Stores,
3,
()=> { Response.Write("<div class=\"portfolio_box_container\">"); },
@<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
,
() => { Response.Write("</div>"); })
我做错了什么?
如果打印出类似的东西:
<div class="portfolio_box_container">
<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
</div>
<div class="portfolio_box_container">
<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
<div class="portfolio_box" style="padding-right: 25px">
<img src="item.png" width="120" height="43" alt="" />
</div>
</div>
答案 0 :(得分:2)
问题是您应该使用HelperResult操作的“writer”参数将操作中的输出写入。现在使用立即写入HTTP响应的Response.Write,而HelperResult有自己的编写器,之后将被复制到响应中。
最简单的解决方案是使用Action<TextWriter
&gt;而不是动作,然后你可以将“作家”传递给你的动作部分。
例如。使用参数Action<TextWriter> rowContainer
,并在Gallery帮助程序中将其称为rowContainer(writer)
。
然后你可以传递像(writer)=> { writer.Write("<div class=\"portfolio_box_container\">"); }