我是MVC 3的新手,并且首先要提出这个问题,
我有一个定义为
的类 Class abc
{ public string Id { get; set; }
public string str1 { get; set; }
public string Action { get; set; }
public string Name { get; set; }
public string Title {get; set;}
}
在我的MVC2 aspx视图中,我使用此类abc作为模型并使用此代码
<%
Model.ForEach(a =>
{ %>
<%= Html.ActionLink(a.Title ,
a.Action , // <-- ActionMethod
a.Name , // <-- Controller Name.
new { key = a.Id }, // <-- Route arguments.
new { title = a.str1 })%>
<br /><br />
<% }); %>
你能帮我把这段代码转换成MVC剃刀视图吗? @model abc
<%
Model.ForEach(a =>
{ %>
<%= Html.ActionLink(a.Title ,
a.Action , // <-- ActionMethod
a.Name , // <-- Controller Name.
new { key = a.Id }, // <-- Route arguments.
new { title = a.str1 })%>
<br /><br />
<% }); %>
当我尝试使用@foreach(模型中的var abc)时,我收到错误信息,需要实现Ienumerable吗?如何使用@for实现请帮助或给我指点。谢谢
答案 0 :(得分:1)
模型仅显示一个对象,而不是对象列表。 因此,您不应该使用ForEach,而是直接访问属性而不使用Model.Name等循环。 如果需要对象列表,则需要更新控制器以使用通用列表返回这些对象的列表。
var abcCollection = new List<abc>();
这应该指向正确的方向。
答案 1 :(得分:1)
user1005310,
对Razor语法的一些了解将有助于此。谷歌先生有很多例子。但是,如果你有一大堆要转换的代码,那么你有一个很棒的“工具”来帮助(现在的OSS,最初是由Telerik开发的)。看看:
https://github.com/telerik/razor-converter
这基本上是一个转换器,它接受整套aspx视图并将它们转换为Razor。我现在已经尝试了几个测试项目,它满足了99%的满意度,另外1%正在解决(或者我可以接受小调整)。
答案 2 :(得分:0)
我建议您使用显示模板。这样您就不需要编写任何循环。所以:
@model IEnumerable<abc>
@Html.DisplayForModel()
然后定义一个显示模板,该模板将自动为模型集合的每个元素(~/Views/Shared/DisplayTemplates/abc.cshtml
)呈现:
@model abc
@Html.ActionLink(
Model.Title,
Model.Action,
Model.Name,
new { key = Model.Id },
new { title = Model.str1 }
)
<br /><br />
请注意,模板按惯例工作。它们必须放在~/Views/Shared/DisplayTemplates
文件夹或~/Views/SomeController/DisplayTemplates
文件夹中,具体取决于您是要在多个控制器或单个控制器的视图之间重用它们。 ASP.NET MVC首先在特定文件夹中查找模板,然后在Shared中查找。文件名也很重要。在这种情况下,您的模型由IEnumerable<abc>
组成,其中abc
是此集合中元素的类型,因此必须将显示模板称为abc.html
。
相同的规则适用于编辑器模板。只需将display
替换为editor
即可。顾名思义,编辑器模板适合放置输入字段以编辑视图模型。