ASP.NET MVC 3 – Plantilla de visualización frente a plantilla de visualización versus editorial

Entonces, el título debería hablar por sí mismo.

Para crear componentes reutilizables en ASP.NET MVC, tenemos 3 opciones (podrían ser otras que no he mencionado):

Vista parcial:

@Html.Partial(Model.Foo, "SomePartial") 

Plantilla de editor personalizado:

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

Plantilla de visualización personalizada:

 @Html.DisplayFor(model => model.Foo) 

En términos de la vista / HTML real, las tres implementaciones son idénticas:

 @model WebApplications.Models.FooObject  

Entonces, mi pregunta es: ¿cuándo / cómo decides cuál de los tres usar?

Lo que realmente estoy buscando es una lista de preguntas que debe hacerse antes de crear una, para lo cual las respuestas se pueden usar para decidir qué plantilla usar.

Aquí están las 2 cosas que he encontrado mejor con EditorFor / DisplayFor:

  1. Respetan las jerarquías de modelo al procesar HTML helpers (por ejemplo, si tiene un objeto “Bar” en su modelo “Foo”, los elementos HTML para “Bar” se representarán con “Foo.Bar.ElementName”, mientras que un parcial tendrá ” ElementName “).

  2. Más robusto, por ejemplo, si tuviera una List de algo en su ViewModel, podría usar @Html.DisplayFor(model => model.CollectionOfFoo) , y MVC es lo suficientemente inteligente como para ver que es una colección y renderizar la única pantalla para cada elemento (a diferencia de un parcial, que requeriría un ciclo for explícito).

También escuché que DisplayFor presenta una plantilla de “solo lectura”, pero no entiendo eso, ¿no podría lanzar un formulario allí?

¿Puede alguien decirme algunas otras razones? ¿Hay alguna lista / artículo en alguna parte que compare los tres?

EditorFor vs DisplayFor es simple. La semántica de los métodos es generar vistas de edición / inserción y visualización / lectura solamente (respectivamente). Use DisplayFor cuando muestre datos (es decir, cuando genere divs y spans que contengan los valores del modelo). Use EditorFor al editar / insertar datos (es decir, cuando genera tags de entrada dentro de un formulario).

Los métodos anteriores están centrados en el modelo. Esto significa que tendrán en cuenta los metadatos del modelo (por ejemplo, podría anotar su clase de modelo con [UIHintAttribute] o [DisplayAttribute] y esto influiría en qué plantilla se elige para generar la UI para el modelo. También se usan generalmente para modelos de datos (es decir, modelos que representan filas en una base de datos, etc.)

Por otro lado, Partial está centrado en la vista porque le preocupa principalmente elegir la vista parcial correcta. La vista no necesita necesariamente un modelo para funcionar correctamente. Solo puede tener un conjunto común de marcas que se reutilice en todo el sitio. Por supuesto, muchas veces quiere afectar el comportamiento de este parcial, en cuyo caso podría querer pasar un modelo de vista apropiado.

Usted no preguntó por @Html.Action que también merece una mención aquí. Podría pensar que es una versión más potente de Partial que ejecuta una acción secundaria de controlador y luego representa una vista (que generalmente es una vista parcial). Esto es importante porque la acción secundaria puede ejecutar lógica comercial adicional que no pertenece a una vista parcial. Por ejemplo, podría representar un componente de carrito de compras. La razón para usarlo es evitar realizar el trabajo relacionado con el carrito de compra en cada controlador de su aplicación.

En última instancia, la elección depende de qué es lo que está modelando en su aplicación. También recuerda que puedes mezclar y combinar. Por ejemplo, podría tener una vista parcial que llame al EditorFor ayudante. Realmente depende de cuál sea tu aplicación y cómo factorizarla para fomentar la máxima reutilización del código y evitar la repetición.

Ciertamente podría personalizar DisplayFor para mostrar un formulario editable. Pero la convención es que DisplayFor sea ​​de readonly y EditorFor para editar. Cumplir con la convención asegurará que no importa lo que pase a DisplayFor , hará el mismo tipo de cosas.

Solo para dar valor a mi 2c, nuestro proyecto está utilizando una vista parcial con varias tabs jQuery, y cada pestaña muestra sus campos con su propia vista parcial. Esto funcionó bien hasta que agregamos una característica por la cual algunas tabs compartían algunos campos comunes. Nuestro primer acercamiento a esto fue crear otra vista parcial con estos campos comunes, pero esto se volvió muy torpe al usar EditorFor y DropDownListFor para renderizar campos y desplegar. Para que los identificadores y los nombres sean únicos, tuvimos que representar los campos con un prefijo en función de la vista parcial primaria que lo representaba:

   

Esto se puso bastante feo, así que decidimos usar Editor Templates, que funcionó mucho más limpio. Agregamos un nuevo Modelo de Vista con los campos comunes, agregamos una Plantilla de Editor correspondiente y representamos los campos usando la Plantilla de Editor desde diferentes vistas principales. La plantilla del editor representa correctamente los identificadores y nombres.

En resumen, una razón de peso para usar Plantillas de Editor fue la necesidad de renderizar algunos campos comunes en varias tabs. Las vistas parciales no están diseñadas para esto, pero las plantillas de editor manejan el escenario perfectamente.

Utilice el _partial vista _partial si:

  1. Ver lógica centrada
  2. Qué mantener todos los HTML relacionados con la vista _partial solo en esta vista. En el método de plantilla, deberá mantener algo de HTML fuera de la Vista de plantilla como “Encabezado principal o cualquier borde / configuración externa”.
  3. Quiere renderizar vista parcial con lógica (desde el controlador) usando URL.Action("action","controller") .

Razones para usar la plantilla:

  1. ¿Desea eliminar ForEach(Iterator) ? La plantilla es lo suficientemente buena para identificar el Modelo como un tipo de lista. Lo hará automáticamente.
  2. Modelo Centric Logic. Si se encuentran varias vistas en la misma pantalla para la carpeta Plantilla, entonces la representación dependerá del Modelo Pasado.

Otra diferencia que no se ha mencionado hasta ahora es que una vista parcial no agrega prefijos de modelo mientras que una plantilla lo hace. Aquí está el problema