MVC Razor我如何使用我的HTML助手?

时间:2011-05-30 01:08:48

标签: asp.net-mvc-3 delegates razor

我已经创建了一个简单的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>

1 个答案:

答案 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\">"); }

这样的动作参数