2011-04-19 17 views
7

tengo que hacer algo como esto:¿Hay alguna manera de evitar que repita mi código en la vista 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> 

estoy usando MVC3 y el motor de vista de la maquinilla de afeitar que es nuevo para mí. Lo que me gustaría hacer es evitar tener que repetir el mismo bloque de cuatro líneas con A1, A2, A3, A4 ... A20. ¿Hay alguna manera de que pueda usar un helper, una plantilla o alguna otra característica para hacerlo, así no tengo que repetir muchas líneas de código?

Respuesta

6

Crea una vista parcial fuertemente tipada para esa clase.

A_Partial.ascx

<div class="editor-field"> 
    @Html.EditorFor(model) 
    @Html.ValidationMessageFor(model) 
</div> 

Entonces hacerlos para cada objeto.

@Html.Partial("A_Partial", model.A1) 
@Html.Partial("A_Partial", model.A2) 
@Html.Partial("A_Partial", model.A3) 
-1

Si es posible, intente ponerlos todos en una sola matriz/diccionario y luego use foreach.

0

Se puede poner en un arreglo:

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

Una opción es utilizar una vista parcial como @Ufuk menciona.

Una mejor manera IMO es utilizar una plantilla de editor, haciendo uso de las convenciones integradas de MVC.

En lugar de tener propiedades únicas para A1, A2, etc. Póngalos en un IEnumerable<Something> Somethings.

Entonces hacer esto en su Vista:

@Html.EditorFor(model => model.Somethings)

A continuación, cree un editor de plantillas denominado Something.cshtml y colocarlo en Shared\EditorTemplates, y MVC va a hacer una "implícita" para cada bucle y hacer que fuera lo que está en el editor de plantillas para el modelo:

<div class="editor-field"> 
    @Html.EditorForModel() 
    @Html.ValidationMessageForModel() 
</div> 

Do not utilizar un foreach bucle - es sopa de código innecesaria y evitable.

Plantilla del editor HTML es idéntico a parcial, fuertemente tipado y todo. La diferencia es la convención para buscar el archivo, mientras que las vistas parciales necesitan el nombre de vista parcial explícito.

Lo que esto significa es que si cambia el tipo de modelo, buscará esa plantilla según el tipo de modelo, lo que permite un enfoque basado en convenciones muy poderoso, que es de lo que se trata MVC.

+1

+1 Gran respuesta que en realidad me ayudó con algo que iba a hacer en la próxima semana. –

+0

@Rory - me alegro de poder ayudar. He estado usando plantillas de editor/visualización extensivamente. Incluso para cosas simples como la forma de renderizar una enumeración. Al crear una plantilla de editor para eso, puedo asegurar que cada Vista que use 'EditorFor' o' DisplayFor' unida a ese tipo de enumeración use esa plantilla. Muy poderoso. Solo uso parciales ahora para el diseño o cuando la plantilla necesita más que el modelo en sí. – RPM1984

Cuestiones relacionadas