ASP.NET MVC 3でDropDownListにデフォルトオプションを追加

8600 ワード

DropDownListはTextBoxなどのコントロールとは異なり、selectタグを使用しています.ドロップダウン・ボックスに表示されるリストとデフォルト・オプションの2つの値が必要です.自動バインドは一度に1つのプロパティしかバインドできません.そのため、必要に応じてバインドリストかデフォルトオプションかを選択する必要があります.
DropDownList拡張メソッドの各リロードバージョン「基本的に」は、このメソッドに渡されます.
public static string DropDownList(this HtmlHelper htmlHelper,   
    string name,   
    IEnumerable selectList,   
    string optionLabel,   
    IDictionary<string, object> htmlAttributes) {   
    …   
}   

selectListが指定されていない場合、このメソッドはリストを自動的にバインドします.すなわち、ViewDataからnameに対応する値を検索します.selectListが指定されている場合、デフォルトのオプションは自動的にバインドされます.つまり、selectListからselected属性がtrueのselectedListItemが見つかります.(詳細はHtmlHelperメソッドのSelectInternalアシストメソッドを参照)
例1:Actionメソッドに次のコードがある場合:

  
List items = new List();   
items.Add(new SelectListItem { Text = "Kirin", Value = "29" });   
items.Add(new SelectListItem { Text = "Jade", Value = "28", Selected = true});   
items.Add(new SelectListItem { Text = "Yao", Value = "24"});   
this.ViewData["list"] = items;   

Viewでは次のように使用されます.
では、補助メソッドは、最初にViewDataからkeyがlistのアイテムを取得し、IEnumerableタイプの場合はドロップダウン・ボックスにバインドします.そうしないと、InvalidOperationExceptionが放出されます.2番目のSelectListItemのSelectedがtrueであるため、デフォルトで2番目が選択されます.
例2:Actionのコードが次の場合:

List items = new List();   
items.Add(new SelectListItem { Text = "Kirin", Value = "29" });   
items.Add(new SelectListItem { Text = "Jade", Value = "28"});   
items.Add(new SelectListItem { Text = "Yao", Value = "24"});   
this.ViewData["list"] = items;   
this.ViewData["selected"] = 24;    
  
"selected", ViewData["list"] as IEnumerable)%> 

では、アシストメソッドは、ViewData[リスト]をドロップダウンボックスにバインドし、次に、keyがselectedであるアイテムをViewDataから取得し、次のリストのValue値がそのアイテムの値と等しいSelecteListItemをデフォルトの選択項目に設定します.
以上の2つの方法は、DropDownListの正確な表示を実現することができるが、ベストプラクティスではない.実際のプロジェクトでは、コードに強いタイプを使用することを望んでいます.例えば、上記の2つの例では、SelectListItemのTextとValueは本来、UserオブジェクトのNameとAge属性であるが、上記のコードはこのような対応関係を少しも体現していない.Userリストがデータベースまたは他の外部リソースから取得された場合、このような方法でバインドしますか?
var users = GetUsers();   
foreach (var user in users)   
{   
    items.Add(new SelectListItem { Text = user.Name, Value = user.Age.ToString() });   
}  

これは明らかに私たちが許せないことだ.では、何がベストプラクティスなのでしょうか.
ASP.NET MVCはDropDownListとListBox(htmlでselectタグを使用する)の補助タイプであるSelectListを用意している.SelectListはMultiSelectListから継承され、後者はIEnumerableを実現する.すなわち、SelectListは直接Htmlとすることができる.DropDownListメソッドの2番目のパラメータ.
MultiSelectListには、次の4つの属性があります.
Items:selectタグに表示されるリストで、通常optionタグで表されます.IEnumerableタイプ.
DataTextField:optionのtextアイテムとしてstringタイプ.
DataValueField:optionのvalueアイテムとしてstringタイプ.
SelectedValue:選択したアイテムのvalue値、IEnumerableタイプ.
DropDownListとしては、選択項目がIEnumerableであることは明らかではありません.そのため、SelectListは新しい属性を提供します.
SelectedValue:選択したアイテムのvalue値、objectタイプ.
また、SelectListのコンストラクション関数は以下のようになります.
public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue)   
    : base(items, dataValueField, dataTextField, ToEnumerable(selectedValue)) {   
    SelectedValue = selectedValue;   
} 

コードは次のようになります.
var users = GetUsers();   
var selectList = new SelectList(users, "Age", "Name", "24");   
this.ViewData["list"] = selectList;   
"list")%>   

もちろん、selectedValueパラメータを持たないコンストラクション関数を使用してリロードし、viewでIEnumerableを明示的に指定し、ViewDataまたはview modelでDropDownListと同じ名前の他の項目をデフォルトオプションとして指定することもできます.
最後にDropDownListの3つの使い方を振り返ってみましょう.
IEnumerableを作成し、デフォルトの選択項目を指定します.
IEnumerableを作成し、個別のViewDataアイテムまたはview modelのプロパティでデフォルトの選択項目を指定します.
SelectListを使用します.
 
(以上の資料はネットから転送したもの)
分類:ASP.NET MVC