我需要做这样的事情:
<div class="editor-field">
@Html.EditorFor(model => model.A1)
@Html.ValidationMessageFor(model => model.A1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.A2)
@Html.ValidationMessageFor(model => model.A2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.A3)
@Html.ValidationMessageFor(model => model.A3)
</div>
我正在使用MVC3和剃须刀视图引擎,这对我来说是个新手。我想要做的是避免重复A1,A2,A3,A4 ... A20的同一块四行。有没有什么方法可以使用帮助器,模板或其他一些功能来实现它,所以我不必重复多行代码。
答案 0 :(得分:12)
一种选择是使用像@Ufuk提及的部分视图。
IMO更好的方法是使用编辑器模板,利用MVC的内置约定。
而不是A1,A2等单一属性。将它们放在IEnumerable<Something> Somethings
。
然后在您的视图中执行此操作:
@Html.EditorFor(model => model.Somethings)
然后创建一个名为Something.cshtml
的编辑器模板并将其放在Shared\EditorTemplates
中,MVC将为每个循环执行“隐式”操作,并渲染模型的编辑器模板中的任何内容:
<div class="editor-field">
@Html.EditorForModel()
@Html.ValidationMessageForModel()
</div>
不要使用 foreach 循环 - 这是不必要且可避免的代码汤。
编辑器模板HTML与部分,强类型和全部相同。不同之处在于查找文件的约定,而部分视图需要显式的部分视图名称。
这意味着如果你改变模型的类型,它将根据模型类型寻找那个模板,允许一个非常强大的基于约定的方法 - 这就是MVC的全部内容。
答案 1 :(得分:6)
创建一个强类型的部分视图。
A_Partial.ascx
<div class="editor-field">
@Html.EditorFor(model)
@Html.ValidationMessageFor(model)
</div>
然后为每个对象渲染它们。
@Html.Partial("A_Partial", model.A1)
@Html.Partial("A_Partial", model.A2)
@Html.Partial("A_Partial", model.A3)
答案 2 :(得分:0)
你可以把它们放在一个数组中:
@foreach(var item in new object[] { Model.A1, Model.A2 /* ... */ }) {
<div class="editor-field">
@Html.EditorFor(item)
@* ... *@
</div>
}
答案 3 :(得分:-1)
如果可能的话,尝试将它们全部放在一个数组/字典中,然后使用foreach。