2009-08-05 12 views
1

Für ViewData, anstatt Strings als Schlüssel verwenden, verwende ich enums. Ich habe momentan eine große Liste, auf die von überall zugegriffen werden kann. Einige Enums werden für mehrere Controller/View-Paare verwendet. Gibt es eine bessere Möglichkeit, diese Enums zu kategorisieren als nur eine ständig wachsende Liste?ASP.NET MVC: enums und ViewData [] Schlüssel

Ich mag nicht die hart codierten Zeichenfolgen, die für ViewData üblich sind. Enums geben große Intellisense. Ich dachte darüber nach, Enums nach Controller zu kategorisieren. Das funktioniert jedoch nicht so gut, da bestimmte Enum-Werte über Controller verteilt sein können und einen zentralen Ort benötigen.

Antwort

4

Haben Sie statt des ViewData-Wörterbuchs in Betracht gezogen, stark typisierte ViewModels zu verwenden?

Wenn Sie eine Klasse namens MyViewModel, können Sie diese von Ihrem Controller-Klasse tun:

public ViewResult Index() 
{ 
    return this.View(new MyViewModel()); 
} 

MyViewModel jede Klasse sein kann - es müssen keine spezifischen Schnittstellen oder irgendetwas zu implementieren. Sie können dann der Klasse alle Eigenschaften hinzufügen, die Sie in der Ansicht benötigen.

Sie können die Ansicht basierend auf Ihrem ViewModel als stark typisierte Ansicht definieren. In Ihrer ASPX-Datei, müssen Sie diese ersetzen:

Inherits="System.Web.Mvc.ViewPage" 

mit diesem:

Inherits="System.Web.Mvc.ViewPage<MyViewModel>" 

Das bedeutet, dass Sie jetzt stark Zugang eingegeben haben werden (einschließlich IntelliSense) an das Ansichtsmodell aus der Ansicht:

this.ViewData.Model.MyProperty 

Ich verwende nie das ViewData-Wörterbuch, da die hier beschriebene Alternative viel stärker ist.

+0

Richtig, aber das funktioniert nicht, wenn mein Controller auf 2+ Modellklassen zugreift, um bestimmte Werte zu erhalten. Die Ansicht kann als nur eine Klasse eingegeben werden. Mit ViewData kann ich mehrere Werte aus mehreren Klassen übernehmen und sie an die Ansicht senden, die nur die Werte anzeigt. – 4thSpace

+3

Das ViewModel sollte die Ansicht unterstützen, damit es alle Eigenschaften haben kann, die Sie benötigen, und so komplex sein, wie Sie es wollen. Wo die Daten herkommen, spielt keine Rolle - dafür ist der Controller verantwortlich. Jedes ViewModel kann auf eine bestimmte Ansicht zugeschnitten werden, sodass Sie ihm genau die Daten geben können, die es haben muss. Wenn Sie komplexe Daten an die View senden möchten, erstellen Sie einfach ein neues ViewModel mit diesen komplexen Klassen als einzelne Eigenschaften. Es besteht keine Notwendigkeit, das ViewData-Wörterbuch zu verwenden. –

Verwandte Themen