2011-04-19 108 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

相關問題