2010-08-06 19 views
10

Suponiendo que desea desarrollar sus Controladores para que use un ViewModel para contener datos para las Vistas que renderiza, ¿deberían contener todos los datos dentro del ViewModel? ¿Qué condiciones sería correcto omitir ViewModel?¿Cuándo es correcto usar ViewData en lugar de ViewModels?

La razón por la que pregunto es que estoy en una posición en la que parte del código está usando ViewData y otro está usando ViewModel. Quiero distribuir un conjunto de pautas en el equipo sobre cuándo es correcto usar ViewData y cuándo solo está tomando atajos. Me gustaría recibir opiniones de otros desarrolladores que hayan tratado con esto para que yo sepa que mis directrices no son solo yo parcial.

Respuesta

9

Solo para seguir el comentario de Fabian; puede asegurarse explícitamente de que viewdata nunca se use siguiendo los pasos descritos en this article. Realmente no hay excusa no para usar modelos para todo.

Si no tiene más remedio que usar ViewData (por ejemplo, en un proyecto existente); como mínimo, use constantes de cadena para resolver los nombres y evitar el uso de "cadenas mágicas". Algo similar a: ViewData[ViewDataKeys.MyKey] = myvalue; De hecho, lo utilizo para todo lo que debe estar "basado en cadenas" (claves de sesión, claves de caché, claves de caché de salida VaryByCustom, etc.).

+4

+1 - siempre utilizamos viewmodels de tipo stongly pero utilizamos viewdata para pequeños bits de 'trim' adicionales. esto SOLAMENTE ocurre para nosotros en vistas parciales que se reutilizan en una variedad de lugares. –

+1

@jim: De acuerdo, hay escenarios (como vistas parciales compartidas) donde esto es inevitable; así que lo mejor es tomar medidas para evitar dispararse en el pie cuando necesite recurrir a ViewData :) – DanP

+0

¿Qué quiere decir con las constantes de cadena frente a las cadenas mágicas, y por qué es inevitable utilizar ViewData en vistas parciales compartidas? – Howiecamp

2

Personalmente, nunca utilizo ViewData, todo pasa por el Modelo, excepto cuando estoy probando algo y rápidamente necesito poder ver el valor de la vista. Strongtyping!

+0

Acepto completamente. Las cuerdas mágicas son, en el mejor de los casos, feas y, en el peor, problemáticas. Dicho esto, también uso ViewData para probar rápidamente cosas, pero el problema es cuando eso termina como la solución permanente. – DaveDev

+0

Sí - 100% de acuerdo. Yo preferiría si eso pudiera ser desaprobado. –

+1

@ Pure.Krome: ciertamente podría emular la depreciación utilizando el método descrito en mi publicación. Anular la propiedad viewdata en un controlador base y agregar el atributo [Obsolete()] le daría el mismo resultado (esencialmente). – DanP

1

En términos de ASP.NET MVC 2, el modelo de ViewModel es el enfoque preferido. El enfoque aprovecha al máximo la verificación del tipo estático en tiempo de compilación. Esto en combinación con compiling mvc views hará que su flujo de trabajo de desarrollo sea mucho más rápido y más productivo ya que los errores se detectan durante el tiempo de compilación/compilación en lugar de en el tiempo de ejecución.

3

Un enfoque que puede considerar a medida que sus vistas se vuelven más complejas, es reservar el uso de Modelos para campos de entrada, y usar ViewData para soportar cualquier otra cosa que la Vista necesite representar.

Hay por lo menos un par de argumentos para apoyar esta:

  1. Tienes una página maestra que requiere algunos datos para estar presentes (por ejemplo, algo así como la información de los usuarios stackoverflow en la cabecera). Al aplicar ActionFilter en todo el sitio, es fácil completar esta información en ViewData después de cada acción. Ponerlo en modelo requeriría que cada otro modelo en el sitio herede de un modelo base (esto puede no parecer malo inicialmente, pero puede complicarse rápidamente).

  2. Cuando está validando un formulario publicado, si hay errores de validación es probable que desee volver a vincular el modelo (con los campos no válidos) a la vista y mostrar los mensajes de validación. Esto está bien, ya que los datos en los campos de entrada se publican y se vincularán al modelo, pero ¿qué pasa con cualquier otro dato que su vista requiera volver a poblarse? (por ejemplo, valores de listas desplegables, mensajes de información, etc.). No se publicarán de nuevo, y puede volverse desordenado volviendo a llenarlos en el modelo "alrededor" de los valores de entrada publicados. A menudo es más simple tener un método que rellene ViewData con los datos de la vista.

En mi experiencia, he encontrado que este enfoque funciona bien.

Y, en MVC3, ¡dynamic ViewModels significa no más indexación de cadenas!

Cuestiones relacionadas