2012-03-28 16 views
6

Sto imparando asp.net MVC e trovato qualcosa di interessante:ASP.net MVC View's Model vs ViewData.Model?

Sembra che non riesco a definire in modo esplicito di Model dalla visualizzazione di una vista con il messaggio di errore dicendo che non ha setter.

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

Poi ho guardato il codice sorgente in WebViewPage.cs e di una visualizzazione proprietà modello è in realtà in questo modo:

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

Così l'errore.

Ma è interessante come posso fare questo: @{ ViewData.Model = "hello"; } e in realtà in grado di utilizzare l'istruzione @model, con conseguente a "ciao"

penso che sto cercando troppo in esso, ma perché è così?

principiante in C# e ASP.NET

+0

@BrokenGlass probabilmente hai bisogno di leggere meglio la sua domanda, è una domanda per principianti ... è piuttosto utile/utile per spiegarlo ... – NiK

+0

@Jan Carlo Viray Potresti chiarire la tua domanda? 'Perché così' cosa? –

+0

Non ho mai saputo che '@ Model' fosse contenuto nel dizionario' ViewData'. Sorprendente, perché ho sentito diverse fonti di tutto rispetto ** RAIL ** contro l'uso di ViewData e tuttavia qui è incorporato nel framework. –

risposta

7

La regola è Separation of Concern ... In MVC, un controller fornisce un modello a una vista e sarà sempre il controller che può impostare/assegnare un modello a una vista .... che le viste possono utilizzare ... questo è di progettazione ... giocare secondo regole è quello che vorrei dire ... e se si sta imparando MVC sua grande e vi consiglio vivamente di leggere

Stevens Sandersons MVC book

2

Cose come ModelBinders e ciò che non a volte hanno bisogno di cambiare il modello in un contesto, quindi hanno bisogno il setter. Un altro motivo è quello di facilitare il test dell'unità.

Tuttavia, raramente è necessario farlo da soli nelle visualizzazioni, quindi utilizzarlo a proprio rischio.

1

non c'è magia Qui. Nel primo caso (come hai sottolineato), non c'è un setter di proprietà per una proprietà Model. Quindi, non puoi assegnare nulla. E questo ha senso: perché è necessario riassegnare il modello dalla vista?

Nel secondo caso si modifica/ignora il vincolo utilizzando direttamente ViewData.Model. Dato che è di tipo Object, puoi assegnare qualsiasi cosa.

(BTW, suppongo nel primo snippet di codice assegna "Ciao", non e 'Ciao')

2

E 'il "pozzo di successo" teoria del disegno API. Non devi alterare la proprietà Model nella tua vista, quindi rendono più difficile farlo. Ma poiché potrebbero esserci casi in cui non hai scelta, non rendono impossibile.