MVC Razor, как я могу использовать мой помощник HTML? - PullRequest
0 голосов
/ 30 мая 2011

Я создал простой html помощник Gallery, на данный момент он не очень хорош, так как я не могу заставить его работать с 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 Ответ

2 голосов
/ 30 мая 2011

Проблема заключается в том, что вы должны использовать параметр «writer» действия HelperResult, чтобы записать вывод ваших действий. Теперь вы используете Response.Write, который немедленно записывает в HTTP-ответ, в то время как HelperResult имеет собственный модуль записи, который впоследствии будет скопирован в ответ.

Самое простое решение, если вы используете Action<TextWriter> вместо Action, и тогда вы можете передать «писателя» своим действиям. Например. используйте параметр Action<TextWriter> rowContainer и вызовите его как rowContainer(writer) в помощнике Галереи.

Затем вы можете передать такой параметр действия, как (writer)=> { writer.Write("<div class=\"portfolio_box_container\">"); }

...