2012-01-19 12 views
4

DropdownListFor関数を使用してドロップダウンリストを作成しようとしていて、値を選択したいとします。asp.netで選択した値MVC 4.0のドロップダウンリスト

私は多くのことを検索しViewModelSelectListオブジェクトを持つの溶液の似たようなものを発見した、私はこの

のようなタイプ SelectListのプロパティを使用し、私の ViewModelでは、それをこの

のようなものを試してみました

SelectList HoursToSelect = new SelectList(MyDictionaryObject, "Value", "Key", 14/*selected value*/); 

と私は、この

@Html.DropDownListFor(m => m.EndsOnHour, HoursToSelect) 

このすべての仕事をしていた罰金Aのようにそれを使用していましたNDは完全に

私の要件を満たししかし、問題は、私のプロジェクトはViewModelで非直列化可能クラッセを許可しないように私は私のViewModelSelectListオブジェクトを使用することはできません私のプロジェクトのアーキテクチャによるものです。

だから、私のために残された唯一の方法は、唯一の私の見解で何かを持つことで、ここで何か

@Html.DropDownListFor(m => m.EndsOnHour, new SelectList(Model.Hours, "Value", "Key")) 

しかし、何を知りません! これを達成するアイデアはありますか?

答えて

4

オブジェクトのプロパティに@Html.DropDownListFor(...)を使用すると、オブジェクトの現在の状態が使用され、選択したアイテムが設定されます。したがって、あなたの例では、選択リストの値を指定しないと、m.EndsOnHourの値を使用して選択した値を設定します。実際には、選択リストは実際にSelectListである必要はありません。documentationに示すように、それは実際にはSelectListItemのコレクションである必要があります。

ただし、シリアル化の問題はまだあります。ここには2つのオプションがあります。最も簡単なのは、可能であれば、ビュー側に値をスローすることです。多くのドロップダウンリストは、静的な選択のために構築されており、状態や国をリストするなど、列挙型の選択肢を表示することができます。他の一般的な例は、日付範囲などです。これらのインスタンスでは、これらのリストを生成してビュー内で呼び出すヘルパーを作成し、ビューモデルから削除するだけです。

リストが動的である場合、これは長期的にはうまく機能せず、システムのメンテナンスに悪影響を与える余分な結合を引き起こす可能性があります。この場合、シリアライズ可能な独自のSelectList子クラスを作成し、それをIEnumerable<T>のシリアライズ可能な実装のジェネリック型パラメータとして使用する必要があります。 C#の配列はシリアライズ可能なので、その部分が処理されます。

3

個人的に私はDropDownListForをあきらめ、ちょうどこのようなことをしました....そのはるかに簡単です。これが良い考えではない理由があるかどうかは不明です。

<select id="details-title"> 
@foreach (var title in Helper.Titles) 
{ 
<option value="@title.Value" @(title.Value==Model.SelectedTitle?"selected=\"selected\" ":"")>@title.Text</option> 
} 
</select> 
+3

クライアント側の検証は手動で行う必要があります。カスタムモデルのバインダーは、これを使用するためのより多くの手動適応が必要です。おそらく定義されたEditorTemplatesへのフックはありません。そして、より多くのコード。最後のものは定義ごとに悪くはないが、このforeachループをドロップダウンリストが定義されているすべてのビューにコピーして貼り付けることです。 'DropDownListFor'は実際にはドロップダウンリストを生成するうえで、モデルのプロパティにバインドするだけです。何らかの理由で本当にこの方法が嫌い(5分以上を費やしている)場合は、独自のHTMLヘルパーを作成することをおすすめします。 –

関連する問題