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


    <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>

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

这对我来说似乎有点太啰嗦了...有没有办法四处走走 创建计数器时必须诉诸标准 for 循环?

是的,这对我来说似乎也太啰嗦了。甚至循环似乎也太冗长了,因为如果您使用编辑器模板,则不需要它。

<ul>
    @Html.EditorFor(x => x.PhoneNumberEntries)
</ul>

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

@model PhoneNumberEntry
<li>
    <span>@Model.PhoneNumber</span> 
    @Html.EditorFor(m => m.PhoneNumber)
</li>

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

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

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

public IEnumerable<FooBarViewModel> FooBars { get; set; }

相应模板的名称将被FooBarViewModel.cshtml,显然它将被强键入以FooBarViewModel .

试试这个:

<ul>
@for (int i=0; i++; i < Model.PhoneNumberEntries.Count)
 {
     <li>@Html.TextBoxFor(m=>Model.PhoneNumberEntries[i].PhoneNumber)</li>
 }
 </ul>

最新更新