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:
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).
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!
+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. –
@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
¿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