2012-12-08 8 views
30

Ich bin ziemlich neu in MVC4, EF5 und ASP.Net, und ich kann nirgendwo eine gute Antwort finden.ViewModels oder ViewBag?

Grundsätzlich sollte alles durch das Viewmodel erledigt werden oder ist es Ok, auch viewbag einzubauen?

Angenommen, ich habe eine Methode, die eine Dropdown-Liste auffüllt, und ich verwende ein Ansichtsmodell, um die Ausgabe für die Ansicht darzustellen.

Bin ich ok Viewbag.DropDown = PopulateDropdown(); zu verwenden oder wäre es besser, diese in das Ansichtsmodell zu integrieren, indem Sie eine Eigenschaft Erstellen der List<SelectListItem> erstellt von PopulateDropdown(); zu halten?

Ich weiß, wie praktisch ViewBag ist, aber ich habe noch keinen Grund zu sehen, es nicht zu verwenden? Wenn mir jemand mehr Einblick geben könnte, wäre das fantastisch.

Antwort

45

Grundsätzlich sollte alles durch das Viewmodel erledigt werden oder ist es Ok um auch Viewbag einzubauen?

Alles sollte in einem Ansichtsmodell erfolgen. Das ist ein Ansichtsmodell. Eine Klasse, die Sie speziell definieren, um die Anforderungen Ihrer Sicht zu erfüllen. Mischen Sie ViewBags nicht mit ViewModels. Für die Ansicht ist nicht mehr klar, woher die Informationen kommen. Verwenden Sie entweder nur ein Ansichtsmodell (Ansatz, den ich empfehle) oder nur ViewBags. Aber nicht die 2.

Also in Ihrem speziellen Beispiel hätten Sie eine Eigenschaft auf Ihrem View-Modell, das vom Typ IENumerable<SelectListItem> ist und innerhalb Ihrer Ansicht verwenden Sie die stark typisierte Version des Html.DropDownListFor Helfer zu binden zum Modell:

@Html.DropDownListFor(x => x.ProductId, Model.Products) 

Offensichtlich sind das nur meine 2 Cent. Andere Leute sagen, dass das Mischen von ViewModels und ViewBags in Ordnung ist, und ich respektiere ihre Meinung.

+0

Danke, Gibt es einen anderen Vorteil über ViewBag Viewmodels abgesehen von der Abstraktion zu verwenden und bietet? – EverythingGeek

+10

Natürlich gibt es das. Sie erhalten Intellisense und Sie können die stark typisierten Versionen der HTML-Helfer in Ihren Ansichten verwenden. Sie erhalten auch einen refektorfreundlichen Code und sind nicht länger auf magische Zeichenfolgen angewiesen. Es ist auch klar, woher die Informationen zu einer bestimmten Ansicht kommen, indem nur das Ansichtsmodell betrachtet wird, in das diese Ansicht stark eingetippt ist. Wenn Sie eine Mischung aus ViewModels und ViewBag verwenden, sollten Sie sich auch die Controller-Aktion ansehen, die den ViewBag setzt. –

+0

Danke für das Aufräumen :) – EverythingGeek

9

Bevorzugen ViewModels über die ViewBag wo immer Sie können. Erstellen Sie stark typisierte Ansichten. Es macht Ihren Code sauberer, weniger anfällig, weniger fehleranfällig und einfach zu warten.

ViewBags sind nur Wörterbücher von dynamisch typisierte Objekte, so dass Sie verlieren:

  • Compile Zeit Überprüfung
  • Die Fähigkeit, mit Vertrauen, Refactoring (Sie die Unterstützung der Werkzeuge verlieren)
  • Unterstützung IDE - wie die Fähigkeit, zu allen Verwendungen zu navigieren
  • Intellisense

Für Bonuspunkte extensive Nutzung des ViewBag machen verpasst auch den Punkt des MVC pattern

ich den Eindruck ViewBags in asp.net mit einem Rand-Fall Problem wurde erhalten geschaffen zu lösen und Menschen nutzen sie statt der Schaffung Betrachten Sie Modelle, wie ursprünglich bei der Gestaltung der Plattform gedacht, zum Nachteil ihrer Arbeit.


mit dank https://stackoverflow.com/a/15568190/10245

+1

Ich sehe dieses Ding über Intellisense. Es ist kein Problem; Sie deklarieren/konvertieren es einfach in der Ansicht und Sie haben Intellisense. Ich gebe zu, ich benutze keine Viewmodels (möglicherweise aufgrund von Faulheit), aber es scheint kein Aufwand zu sein, einen Viewbag zu verwenden, wenn man bedenkt, dass es einfach ist, intellisense dafür zu bekommen. –

+0

Es gibt keine Intelligenz für den Inhalt der Viewbag, es gibt für das Seitenmodell. Wenn das nicht genug ist, kann ich dir wirklich nicht helfen. Erinnere mich einfach daran, niemals an einem der Projekte zu arbeiten, an denen du gearbeitet hast, es sei denn, ich bekomme all das schwache Tippen raus, so dass ich hoffe, es zu behalten. Wenn du denkst, dass es um "Ärger" geht, verpasst du den Punkt. –

+1

Wenn Sie es in der Ansicht deklarieren, haben Sie intellisense auf die gleiche Weise, als hätten Sie ein Viewmodel erstellt. Der Viewbag-Typ ist, was auch immer es gegeben wurde - Sie wissen, welches Objekt Sie ihm gegeben haben, damit Sie dasselbe Objekt in der Ansicht erzeugen. Wenn Sie zum Beispiel eine Liste von Objekten haben, deklarieren Sie diese Liste in der Ansicht oben auf der Seite und senden Sie den Viewbag dorthin. Ich kann ein Viewmodel oder Viewbag machen - keiner ist viel besser anzuschauen als der andere. Intellisense ist sicherlich nie ein Problem, es sei denn, Sie verwenden den Viewbag direkt auf der Ansicht. –