これを機能させるには、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>
)