2009-08-05 10 views
1

ViewDataでは、文字列をキーとして使用するのではなく、enumを使用しています。私は現在、どこからでもアクセスできる1つの大きなリストを現在持っています。一部の列挙型は、複数のコントローラ/ビューのペアで使用されます。絶えず増加するリストではなく、これらの列挙型を分類する良い方法はありますか?ASP.NET MVC:enumsとViewData []キー

ViewDataで一般的なハードコードされた文字列が好きではありません。列挙は大きなインテリセンスを与える。私はコントローラーで列挙型を分類することを考えました。特定の列挙型の値がコントローラ間で共有され、集中化された場所が必要な場合もあるので、それはあまりうまく機能しません。

答えて

4

ViewData辞書を使用する代わりに、厳密に型指定されたViewModelsを使用することを検討しましたか?

あなたはMyViewModelというクラスを持っている場合は、あなたのコントローラクラスからこれを行うことができます。

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

MyViewModelは、任意のクラスすることができます - それは、特定のインターフェイスまたは何かを実装する必要はありません。ビューに必要なクラスにすべてのプロパティを追加することができます。

ビューは、ViewModelに基づいて厳密に型指定されたビューとして定義できます。これで

Inherits="System.Web.Mvc.ViewPage" 

:あなたの.aspxのファイルでは、これを交換する必要が

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

これは、あなたが今強くビューからのViewModelに(インテリセンスを含む)へのアクセスを入力したことを意味します:

this.ViewData.Model.MyProperty 

ここで概説されている代替案ははるかに強く、私はViewData辞書を使用しません。

+0

私のコントローラが特定の値を取得するために2つ以上のモデルクラスにアクセスする場合、それは機能しません。ビューは1つのクラスとしてのみ入力できます。 ViewDataを使用すると、いくつかのクラスからいくつかの値を取得し、ビューに送信することができます。ビューは値を表示する以外は何もしません。 – 4thSpace

+3

ViewModelはViewをサポートする必要があるため、必要なプロパティを自由に持ち、必要なだけ複雑にすることができます。データがどこから来るのかは無関係です - それはコントローラの責任です。各ViewModelは特定のViewに合わせて調整することができ、必要なデータを正確に与えることができます。ビューに複雑なデータを送信する場合は、これらの複雑なクラスを個別のプロパティとして持つ新しいViewModelを作成します。実際にViewData辞書を使用する必要はありません。 –

関連する問題