2011-04-19 121 views
7

我需要做这样的事情:有没有办法避免我在MVC 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,并且是新的我的Razor视图引擎。我想要做的是避免重复A1,A2,A3,A4 ... A20四条线的同一块。有什么方法可以使用助手,模板或其他功能来实现它,所以我不必重复许多代码行。

回答

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

如果可能,请尝试将它们全部放在单个数组/字典中,然后使用foreach。

0

你可以把它们放入数组:

@foreach(var item in new object[] { Model.A1, Model.A2 /* ... */ }) { 
    <div class="editor-field"> 
     @Html.EditorFor(item) 
     @* ... *@ 
    </div> 
} 
11

一种选择是像@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

+1这是一个很好的答案,这个答案实际上帮助我在下周左右的时间内做出了一些事情。 – 2011-04-19 13:50:48

+0

@Rory - 很高兴我能帮上忙。我一直在广泛使用编辑器/显示模板。即使对于简单的东西,比如如何渲染枚举。通过为其创建编辑器模板,我可以确保每个使用'EditorFor'或'DisplayFor'的视图绑定到该枚举类型都使用该模板。很强大。我现在只使用局部布局,或者当模板需要的不仅仅是模型本身。 – RPM1984 2011-04-19 23:26:56

相关问题