Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC3中使用Action<的HtmlHelper;T>;作为模板:Razor语法?_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC3中使用Action<的HtmlHelper;T>;作为模板:Razor语法?

Asp.net mvc 3 ASP.NET MVC3中使用Action<的HtmlHelper;T>;作为模板:Razor语法?,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,让我先说一句,也许有更好的方法可以做到这一点,而Razor正在照亮这条路。在任何情况下,我都有一个HTML帮助程序,它可以充当某种类型的重复程序,但在任意次数的重复之后,它会插入一个备用模板。最明显的用途是什么?在x单元格后开始新行的表。辅助对象如下所示: public static void SeriesSplitter<T>(this System.Web.Mvc.HtmlHelper htmlHelper, IEnumerable<T> items, int ite

让我先说一句,也许有更好的方法可以做到这一点,而Razor正在照亮这条路。在任何情况下,我都有一个HTML帮助程序,它可以充当某种类型的重复程序,但在任意次数的重复之后,它会插入一个备用模板。最明显的用途是什么?在x单元格后开始新行的表。辅助对象如下所示:

public static void SeriesSplitter<T>(this System.Web.Mvc.HtmlHelper htmlHelper, IEnumerable<T> items, int itemsBeforeSplit, Action<T> template, Action seriesSplitter)
{
    if (items == null)
        return;
    var i = 0;
    foreach (var item in items)
    {
        if (i != 0 && i % itemsBeforeSplit == 0)
            seriesSplitter();
        template(item);
        i++;
    }
}
<table>
    <tr>
    <% Html.SeriesSplitter(Model.Photos, 4, photo => { %>
            <td><img src="<%=ResolveUrl("~/Thumbnail.ashx?id=" + photo.ID)%>" alt="<%=Html.Encode(photo.Title)%>" /></td>
    <% }, () => { %></tr><tr><% }); %>
    </tr>
</table>
public static void SeriesSplitter(this System.Web.Mvc.HtmlHelper HtmlHelper、IEnumerable items、int itemsbeforeplit、动作模板、动作序列plitter)
{
if(items==null)
返回;
var i=0;
foreach(项目中的var项目)
{
如果(i!=0&&i%itemsbeforsplit==0)
seriesSplitter();
模板(项目);
i++;
}
}
在Webforms视图中,用法如下所示:

public static void SeriesSplitter<T>(this System.Web.Mvc.HtmlHelper htmlHelper, IEnumerable<T> items, int itemsBeforeSplit, Action<T> template, Action seriesSplitter)
{
    if (items == null)
        return;
    var i = 0;
    foreach (var item in items)
    {
        if (i != 0 && i % itemsBeforeSplit == 0)
            seriesSplitter();
        template(item);
        i++;
    }
}
<table>
    <tr>
    <% Html.SeriesSplitter(Model.Photos, 4, photo => { %>
            <td><img src="<%=ResolveUrl("~/Thumbnail.ashx?id=" + photo.ID)%>" alt="<%=Html.Encode(photo.Title)%>" /></td>
    <% }, () => { %></tr><tr><% }); %>
    </tr>
</table>

{ %>
“alt=”“/>
{ %>
在本例中,您将有一个表,该表呈现四个单元格,然后使用备用模板(行开始和结束标记)启动新行。问题是我找不到在Razor中实现这一点的方法。在Razor视图中使用lambda似乎是一个非常奇怪的构造


你会怎么做?

这是
Func
的工作(尽管我是从内存中完成的,所以可能需要调整):

public static void SeriesSplitter(此System.Web.Mvc.HtmlHelper-HtmlHelper,
i数不清的项目,
int itemsbeforsplit,
Func模板,
Func系列打印机){
//这里的代码和以前差不多
}
那么你会这么说吗

@Html.SeriesSplitter(Model.Items, 3, @<td>item.Id</td>, @:</td><td>
)
@Html.SeriesSplitter(Model.Items,3,@item.Id,@:
)

请注意,由于Razor在解析过程中如何进行标记平衡,因此您需要在
@:

之后使用新行,Phil实际上有一篇很好的帖子解决了这里的问题:


但实际调用中的“项”来自何处?我最终在三个视图中使用了一些重复的逻辑,这是我需要的,虽然不那么优雅,但我无法再花更多的时间让Razor像Webforms视图一样工作。