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

时间:2012-01-24 13:44:15

标签: asp.net-mvc-3 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>

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

2 个答案:

答案 0 :(得分:6)

  

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

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

<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内,并且它是ASP.NET MVC首先查找它的位置。或者您也可以将其放在~/Views/XXX/EditorTemplates内,其中XXX是当前控制器的名称。然后,编辑器模板的名称必须是用作集合属性的agrument类型的名称。

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

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

相应模板的名称为FooBarViewModel.cshtml,显然会强烈输入FooBarViewModel

答案 1 :(得分:2)

试试这个:

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