1

人気のあるasp.netMVC2.0solr.netサンプルアプリコードをRazor構文に変換しようとしています。私は最後の行を理解することができません...親切に助けてください

 <% Html.Repeat(new[] { 5, 10, 20 }, ps => { %>
            <% if (ps == Model.Search.PageSize) { %>
            <span><%= ps%></span>
            <% } else { %>
            <a href="@Url.SetParameters(new {pagesize = ps, page = 1})">@ps</a>
            <% } %>
  <% }, () => { %> | <% }); %>

[更新] Html.Repeat拡張機能のソース

HtmlHelperRepeatExtensions.cs

4

2 に答える 2

2

これを機能させるには、Phil Haack が示すように、テンプレート化された Razor デリゲートHtml.Repeatを利用するように拡張メソッドを変更する必要があります。その後:

@{Html.Repeat(
    new[] { 5, 10, 20 }, 
    @<text>
        @if (item == Model.Search.PageSize)
        {
            <span>@item</span>
        }
        else
        {
            <a href="@Url.SetParameters(new { pagesize = item, page = 1 })">
                @item
            </a>
        }
    </text>,
    @<text>|</text>
);}

アップデート:

更新された質問によると、カスタム HTML ヘルパーを使用しているようですが、私の回答で述べたように、このヘルパーを更新して、テンプレート化された Razor Delegates 構文を使用する必要があります。たとえば、次のようになります。

public static class HtmlHelperRepeatExtensions
{
    public static void Repeat<T>(
        this HtmlHelper html,
        IEnumerable<T> items,
        Func<T, HelperResult> render,
        Func<dynamic, HelperResult> separator
    )
    {
        bool first = true;
        foreach (var item in items)
        {
            if (first)
            {
                first = false;
            }
            else
            {
                separator(item).WriteTo(html.ViewContext.Writer);
            }

            render(item).WriteTo(html.ViewContext.Writer);
        }
    }
}

または、ヘルパー メソッドが直接 HelperResult を返すようにしたい場合は、呼び出し時に角かっこを使用する必要がありません。

public static class HtmlHelperRepeatExtensions
{
    public static HelperResult Repeat<T>(
        this HtmlHelper html,
        IEnumerable<T> items,
        Func<T, HelperResult> render,
        Func<dynamic, HelperResult> separator
    )
    {
        return new HelperResult(writer =>
        {
            bool first = true;
            foreach (var item in items)
            {
                if (first)
                    first = false;
                else
                    separator(item).WriteTo(writer);
                render(item).WriteTo(writer);
            }
        });
    }
}

そしてあなたのビューの中で:

@Html.Repeat(
    new[] { 5, 10, 20 }, 
    @<text>
        @if (item == Model.Search.PageSize)
        {
            <span>@item</span>
        }
        else
        {
            <a href="@Url.SetParameters(new { pagesize = item, page = 1 })">
                @item
            </a>
        }
    </text>,
    @<text>|</text>
)
于 2012-06-14T15:40:16.520 に答える
0

おそらく次のようなものです:

}, () => { <text>|</text> });

于 2012-06-14T15:36:22.763 に答える