ASP.NET MVC 3: plantilla parcial frente a plantilla de visualización frente a plantilla de editor
Así que el título debería hablar por sí solo.
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
<!-- Bunch of HTML -->
Entonces, mi pregunta es: ¿cuándo y 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, cuyas respuestas puedan usarse para decidir qué plantilla usar.
Aquí están las 2 cosas que he encontrado mejores con EditorFor/DisplayFor:
Respetan las jerarquías de modelos al representar ayudas HTML (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á " NombreDeElemento").
Más robusto, por ejemplo, si tuviera
List<T>
algo en su ViewModel, podría usarlo@Html.DisplayFor(model => model.CollectionOfFoo)
, y MVC es lo suficientemente inteligente como para ver que es una colección y representar la visualización única para cada elemento (a diferencia de un Parcial, que requeriría un explícito para bucle).
También escuché que DisplayFor presenta una plantilla de "solo lectura", pero no lo entiendo. ¿No podría incluir un formulario allí?
¿Alguien puede decirme otras razones? ¿Hay alguna lista/artículo en algún lugar 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/solo lectura (respectivamente). Úselo DisplayFor
cuando muestre datos (es decir, cuando genere divs y spans que contengan los valores del modelo). Úselo EditorFor
al editar/insertar datos (es decir, cuando genera etiquetas de entrada dentro de un formulario).
Los métodos anteriores se centran en el modelo. Esto significa que tendrán en cuenta los metadatos del modelo (por ejemplo, podría anotar la clase de su modelo con [UIHintAttribute]
o [DisplayAttribute]
y esto influiría en qué plantilla se elige para generar la interfaz de usuario para el modelo. También se suelen utilizar para modelos de datos (es decir, modelos que representar filas en una base de datos, etc.)
Por otro lado, Partial
está centrado en la vista, ya que lo que más le preocupa es elegir la vista parcial correcta. La vista no necesita necesariamente un modelo para funcionar correctamente. Puede simplemente tener un conjunto común de marcas que se reutiliza en todo el sitio. Por supuesto, muchas veces desea afectar el comportamiento de este parcial, en cuyo caso es posible que desee pasar un modelo de vista apropiado.
No preguntaste sobre @Html.Action
cuál también merece una mención aquí. Podrías considerarlo como una versión más poderosa, Partial
ya que ejecuta una acción secundaria del controlador y luego representa una vista (que generalmente es una vista parcial). Esto es importante porque la acción secundaria puede ejecutar lógica empresarial 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 compras 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. Recuerda también que puedes mezclar y combinar. Por ejemplo, podría tener una vista parcial que llame al EditorFor
ayudante. Realmente depende de cuál sea su aplicación y cómo factorizarla para fomentar la máxima reutilización del código y evitar la repetición.
Ciertamente puedes personalizarlo DisplayFor
para mostrar un formulario editable. Pero la convención es para DisplayFor
ser readonly
y EditorFor
ser para editar. Cumplir con la convención garantizará que, sin importar a qué pase DisplayFor
, hará el mismo tipo de cosas.