Syntax ASP.Net MVC Phil Haack的语法';使用Razor的s中继器语法(MVC 3)?

Syntax ASP.Net MVC Phil Haack的语法';使用Razor的s中继器语法(MVC 3)?,syntax,asp.net-mvc-3,razor,Syntax,Asp.net Mvc 3,Razor,我最近开始使用ASP.NETMVC3RC2,并尝试使用Razor语法在MVC2中迁移现有网站。在MVC 2应用程序中,我使用Phil Haack在下面提供的代码基中继器: 我的问题是关于Razor的语法。我不明白以下模块中的模板如何在Razor中重写,也找不到任何文档可供帮助(文档或我的简单性的早期…): { %> 在大括号(tr)之间应用模板时会出现问题。我曾尝试使用WebGrid控件,但它没有提供设置“禁用”行所需的功能(我认为).事实上,现在我再想一想,我不认为你可以在Razor中使

我最近开始使用ASP.NETMVC3RC2,并尝试使用Razor语法在MVC2中迁移现有网站。在MVC 2应用程序中,我使用Phil Haack在下面提供的代码基中继器:

我的问题是关于Razor的语法。我不明白以下模块中的模板如何在Razor中重写,也找不到任何文档可供帮助(文档或我的简单性的早期…):


{ %>

在大括号(tr)之间应用模板时会出现问题。我曾尝试使用WebGrid控件,但它没有提供设置“禁用”行所需的功能(我认为).

事实上,现在我再想一想,我不认为你可以在Razor中使用类似的
动作
参数。我记得以前遇到过这种情况

更新 Andrew Nurse的回答是: “不幸的是,这是当前解析器的设计,尽管我应该指出,我们希望对其进行改进。问题是,标记仅在语句开始时有效(从技术上讲,就是您放置标记的地方),但我们的C#“解析器”目前还不够智能,无法检测lambda。”

虽然这可能已经过时了:)

@Html.Repeater(模型,“行”、“行alt”,
@
@项目名称
@项目.说明
@Html.RouteLink(“编辑”,item.ObjectToUseRouteValues(“编辑”))
@Html.RouteLink(“选择”,item.ObjectToUseRouteValues())
)
公共静态IHtmlString中继器(此HtmlHelper html,IEnumerable items,
字符串类名称、字符串类名称(Alt、Func render){
if(items==null)
返回新的HtmlString(“”);
int i=0;
StringBuilder sb=新的StringBuilder();
foreach(项目中的var项目){
item.ClassType=item.Enabled?(i++%2==0?类名:classNameAlt):“disabled”;
sb.Append(render(item).ToHtmlString());
}
返回新的HtmlString(sb.ToString());
}
}

我写了
@helper
版本。
@helper
不要使用泛型方法

@helper ForEach(IEnumerable<int> items, Func<object, HelperResult> template){
    foreach(var item in items){
        Write(template(item));
    }
}
<div>
<ul>
@ForEach(Enumerable.Range(1,5),
    @<li>@item</li>
)
</ul>
</div>
@helper ForEach(IEnumerable项,Func模板){
foreach(项目中的var项目){
编写(模板(项目));
}
}
    @ForEach(可枚举范围(1,5), @
  • @item
  • )

希望看到这段代码。

您好,我已经尝试过了,但是问题在于编译器如何在委托函数中感知html。它似乎不像在c#aspx实现中那样识别它。所以在{}之间,它将它们视为随机的文本片段,而不是字符串。更新后的我不认为最好询问Haacked…恐怕我的答案很糟糕。这是正确的,不幸的是,我们现在没有足够智能的解析器来检测lambda。可以重写helper以使用内联模板语法,事实上,我在这里就是这么做的:谢谢,我非常确定是这样,但我不完全有信心:)
@Html.Repeater(Model, "row", "row-alt", 
    @<tr class="@item.ClassType : "disabled"">
        <td>@item.Name</td>
        <td>@item.Description</td>
        <td>@Html.RouteLink("Edit", item.ObjectToUseRouteValues("Edit"))</td>
        <td></td>
        <td>@Html.RouteLink("Select", item.ObjectToUseRouteValues())</td>
    </tr>
)

    public static IHtmlString Repeater<T>(this HtmlHelper html, IEnumerable<T> items,
         string className, string classNameAlt, Func<T, HelperResult> render) {
        if (items == null)
            return new HtmlString("");

        int i = 0;
        StringBuilder sb = new StringBuilder();
        foreach (var item in items) {
            item.ClassType = item.Enabled ? (i++ % 2 == 0 ? className : classNameAlt) : "disabled";
            sb.Append(render(item).ToHtmlString());
        }

        return new HtmlString(sb.ToString());
    }

}
@helper ForEach(IEnumerable<int> items, Func<object, HelperResult> template){
    foreach(var item in items){
        Write(template(item));
    }
}
<div>
<ul>
@ForEach(Enumerable.Range(1,5),
    @<li>@item</li>
)
</ul>
</div>