2

我正在查看页面,其中包含以下剃须刀扩展:

public static void Repeat<T>(this HtmlHelper html, IEnumerable<T> items, Action<T> render, Action separator)

以下是该页面的使用示例:

<% Html.Repeat(Model.Products, p => { %> 
    <div><%= p.Id%></div>
    <div><%= p.Name%></div>
<%}, () => { %> 
    <br /> <%-- separator --%>
<% }); %>

我不知道如何将上面的代码片段转换为剃须刀代码,如何将 Html 输出嵌入到函数调用代码块中?

我试过这个:

@Html.Repeat(
  items: Model.Nodes,
  render: node => @: <a href='@node.Title'>@node.Url<a />
, separator: () => @:|
)

但我得到以下异常:

CS0201:只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句

我按照下面的回答更新了Repeat函数,现在我的剃须刀代码如下所示:

@{
  Html.Repeat(
    items: Model.Nodes,
    template: @<text><a href="@item.Url">@item.Title</a></text>,
    separator:  @<text> | </text>);
}

但实际上没有项目被渲染。

4

3 回答 3

1

下面的扩展方法让你可以让helper方法直接返回一个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>
)

请注意,我从以下链接中获取了上面的代码。有关详细信息,请参阅以下帖子。

从 MVC 2.0 代码转换为 razor 语法

于 2012-12-12T11:19:06.643 回答
0

试试这个:

@Html.Repeat(
  items: Model.Nodes,
  render: node => ((Func<dynamic, object>)(@<a href='@node.Title'>@node.Url<a />)).Invoke(node),
  separator: node => ((Func<dynamic, object>)(@<text>|</text>)).Invoke(node)
)
于 2014-02-18T17:06:07.960 回答
0

看起来 Html.Repeat 扩展返回类型是无效的。aspx 引擎渲染器以不同的方式处理它。所以扩展方法几乎不需要改变。

 @Html.Repeat(p.Categories, cat => {
                    return "<a href=" + Url.SetFacet("cat", cat) + ">" + cat + "</a>";
                 }, ",")

方法定义

    public static MvcHtmlString Repeat<T>(this HtmlHelper html, IEnumerable<T> items, Func<T, string> content, string separator)
    {
        if (items == null)
            items = Enumerable.Empty<T>();
        return MvcHtmlString.Create(string.Join(separator, items.Select(content).ToArray()));
    }
于 2016-02-09T19:00:31.520 回答