MVC 3中的@foreach循环

时间:2012-02-15 17:33:21

标签: asp.net-mvc-3

我是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实现请帮助或给我指点。谢谢

3 个答案:

答案 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即可。顾名思义,编辑器模板适合放置输入字段以编辑视图模型。