2012-03-28 18 views
6

estoy aprendiendo asp.net mvc y encontró algo interesante:ASP.net MVC View's Model vs ViewData.Model?

Parece que no puedo definir explícitamente de Model desde la vista de una vista con el mensaje de error que indica que no tiene colocador.

@{ this.Model = "Hello" } //error

Y miré en el código fuente en WebViewPage.cs y la propiedad Modelo de una vista es realmente así:

public object Model { get { return ViewData.Model; } }

lo tanto el error.

Pero es interesante cómo puedo hacer esto: @{ ViewData.Model = "hello"; } y ser capaz de utilizar la instrucción @model, el resultado "hola"

Creo que estoy mirando demasiado en él en realidad, pero ¿por qué es esto así?

principiante en C# y ASP.NET

+0

@BrokenGlass probablemente necesite leer su pregunta mejor, es una pregunta para novatos ... es bastante útil/útil para explicarlo ... – NiK

+0

@ Jan Carlo Viray ¿Podría aclarar su pregunta? '¿Por qué tan' qué? –

+0

En realidad, nunca supe que '@ Model' estaba contenido en el diccionario' ViewData'. Asombroso, porque he escuchado varias fuentes respetadas ** RAIL ** contra el uso de ViewData y, sin embargo, aquí está integrado en el marco. –

Respuesta

7

La regla es la separación de la preocupación ... En MVC, un controlador suministra un modelo a una vista y siempre será el controlador que puede establecer/asignar un modelo a una vista ... que las vistas pueden usar ... esto es por diseño ... jugar con las reglas es lo que diría ... y si usted está aprendiendo su gran MVC y recomiendo encarecidamente que lea

Stevens Sandersons MVC book

2

Cosas como ModelBinders y lo que no necesitan a veces un cambio de modelo en el contexto, por lo que necesitan la incubadora. Otra razón es facilitar las pruebas unitarias.

Sin embargo, rara vez tendrá que hacer esto usted mismo en las vistas, por lo que abusar de ella bajo su propio riesgo.

1

no hay magia aquí. En el primer caso (como usted señaló), no existe un establecimiento de propiedades para una propiedad del Modelo. Entonces, no puedes asignar nada. Y eso tiene sentido: ¿por qué necesita volver a asignar el modelo desde la vista?

En el segundo caso, piratear/eludir esa restricción usando ViewData.Model directamente. Como es de Tipo de objeto, puede asignar cualquier cosa.

(Por cierto, supongo que en el primer fragmento de código que asigna "Hola", no 'Hola')

2

Es el "pozo del éxito" teoría del diseño de la API. No debe alterar la propiedad del Modelo en su vista, por lo que es más difícil hacerlo. Pero dado que puede haber casos en los que no tiene opción, no lo hacen imposible.