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

Ken*_*nny 8 asp.net-mvc razor asp.net-mvc-3

我需要做这样的事情:

<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>
Run Code Online (Sandbox Code Playgroud)

我正在使用MVC3和剃刀视图引擎,这对我来说是新的.我想要做的是避免重复A1,A2,A3,A4 ... A20的同一块四行.有没有什么方法可以使用帮助器,模板或其他一些功能来实现它,所以我不必重复多行代码.

RPM*_*984 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>
Run Code Online (Sandbox Code Playgroud)

不要使用foreach循环 - 这是不必要的和可避免的代码汤.

编辑器模板HTML与部分,强类型和全部相同.不同之处在于查找文件的约定,而部分视图需要显式的部分视图名称.

这意味着如果你改变模型的类型,它将根据模型类型寻找那个模板,允许一个非常强大的基于约定的方法 - 这就是MVC的全部内容.


Ufu*_*arı 6

创建一个强类型的部分视图.

A_Partial.ascx

<div class="editor-field">
   @Html.EditorFor(model)
   @Html.ValidationMessageFor(model)
</div>
Run Code Online (Sandbox Code Playgroud)

然后为每个对象渲染它们.

@Html.Partial("A_Partial", model.A1)
@Html.Partial("A_Partial", model.A2)
@Html.Partial("A_Partial", model.A3)
Run Code Online (Sandbox Code Playgroud)