有没有更简单的方法来编写这个html/razor代码

ek_*_*_ny 1 razor asp.net-mvc-3

    <ul>
    @{int i=0;}
    @foreach (var entry in Model.PhoneNumberEntries)
     {
         <li>
             <span>@entry.PhoneNumber<span> 
             @Html.TextBoxFor(m=>Model.PhoneNumberEntries[i].PhoneNumber)</li>
         i++;
     }
     </ul>
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有点过于冗长......有没有办法绕过创建计数器而不得不求助于循环标准?

Dar*_*rov 6

这对我来说似乎有点过于冗长......有没有办法绕过创建计数器而不得不求助于循环标准?

是的,对我来说似乎也太冗长了.如果使用编辑器模板,即使循环看起来也太冗长了,因为你不需要它.

<ul>
    @Html.EditorFor(x => x.PhoneNumberEntries)
</ul>
Run Code Online (Sandbox Code Playgroud)

然后显然你会定义一个自动为PhoneNumberEntries集合的每个元素呈现的自定义编辑器模板(~/Views/Shared/EditorTemplates/PhoneNumberEntry.cshtml):

@model PhoneNumberEntry
<li>
    <span>@Model.PhoneNumber</span> 
    @Html.EditorFor(m => m.PhoneNumber)
</li>
Run Code Online (Sandbox Code Playgroud)

您甚至不需要编写循环,因为模板按惯例工作.

请注意,编辑器模板的名称和位置很重要.~/Views/Shared/EditorTemplates如果要在属于应用程序中不同控制器的视图之间共享此模板,它应位于内部,并且它是ASP.NET MVC首先查找它的位置.或者,你也可以将其放在~/Views/XXX/EditorTemplates哪里XXX是当前控制器的名称.然后,编辑器模板的名称必须是用作集合属性的agrument的类型的名称.

因此,如果您没有主视图模型:

public IEnumerable<FooBarViewModel> FooBars { get; set; }
Run Code Online (Sandbox Code Playgroud)

相应模板的名称将是,FooBarViewModel.cshtml并且显然它将被强类型化FooBarViewModel.