2012-03-28 19 views
6

Ich lerne asp.net MVC und habe etwas Interessantes gefunden:ASP.net MVC Views Modell vs ViewData.Model?

Es scheint, dass ich nicht explizit eine Ansicht des Model aus der Ansicht mit Fehlermeldung definieren kann sagen, dass es keine Setter hat.

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

Dann schaute ich auf den Quellcode in WebViewPage.cs und Modell-Eigenschaft des View ist tatsächlich so:

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

So der Fehler.

Aber es ist interessant, wie ich das tun kann: @{ ViewData.Model = "hello"; } und tatsächlich in der Lage sein, die @model Anweisung zu verwenden, was zu „Hallo“

Ich glaube, ich bin auf der Suche zu viel hinein, aber warum ist das so?

Anfänger in C# und ASP.NET

+0

@BrokenGlass wahrscheinlich müssen Sie seine Frage besser lesen, es ist ein Neuling ein bisschen Frage ... es ist ziemlich nützlich/hilfreich, es zu erklären ... – NiK

+0

@ Jan Carlo Viray Könnten Sie Ihre Frage klären? 'Warum so' was? –

+0

Ich wusste nie, dass '@ Model' im' ViewData'-Dictionary enthalten ist. Erstaunlich, denn ich habe mehrere gut respektierte Quellen ** RAIL ** gegen die Verwendung von ViewData gehört und doch ist es hier in das Framework eingebaut. –

Antwort

7

Die Regel ist Separation of Concern ... In MVC liefert ein Controller ein Modell an eine Ansicht und es wird immer der Controller sein, der ein Model einer Ansicht zuweisen/zuweisen kann ... welche die Ansichten verwenden können ... dies ist konstruktions ... von Regeln spielen ist, was würde ich sagen ... und wenn Sie MVC seine große lernen und ich möchte Sie

Stevens Sandersons MVC book

2

Dinge wie Modelbinder und was nicht manchmal braucht das Modell im Kontext zu ändern, also müssen sie den Setter. Ein weiterer Grund ist die Vereinfachung der Komponententests.

Allerdings müssten Sie dies selten selbst in Ansichten tun, also missbrauchen Sie es auf eigene Gefahr.

1

Es gibt keine Magie zu lesen empfehlen dringend, Hier. Im ersten Fall (wie Sie darauf hingewiesen haben) gibt es keinen Eigenschaften-Setter für eine Model-Eigenschaft. Sie können also nichts zuweisen. Und das macht Sinn - warum müssen Sie das Modell aus der Sicht neu zuordnen?

Im zweiten Fall hacken/umgehen Sie diese Einschränkung mit ViewData.Model direkt. Da es sich um einen Objekttyp handelt, können Sie alles zuweisen.

(BTW, nehme ich in der ersten Code-Snippet Sie zuweisen "Hallo", nicht 'Hallo')

2

Es ist die "Grube des Erfolges" Theorie der API-Design. Sie sollten die Model-Eigenschaft in Ihrer Ansicht nicht ändern, daher wird es schwieriger. Aber da es Fälle geben kann, in denen Sie keine Wahl haben, machen sie es nicht unmöglich.