有没有办法避免我在MVC Razor视图中重复我的代码?

时间:2011-04-19 10:05:26

标签: asp.net-mvc asp.net-mvc-3 razor

我需要做这样的事情:

<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的同一块四行。有没有什么方法可以使用帮助器,模板或其他一些功能来实现它,所以我不必重复多行代码。

4 个答案:

答案 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。