AS.NET MVCではDropDownListを使用します.


来た:http://www.cnblogs.com/kirinboy/archive/2009/10/28/use-dropdownlist-in-asp-net-mvc.html
ASP.NET MVCでは、直接ページでHTMLコントロールを作成し、コントロールの属性をバインドすることができますが、より便利な方法はHtmlHelperの補助方法を使用します.Viewには、HtmlHelperのタイプの属性Htmlが含まれています.コントロールを提示するための近道があります.
今日は主にHtml.DropDownListの使い方を検討します.まずHtml.TextBoxから始まります.
Html.TextBoxには、次のような重み付け方法があります.
public static string TextBox(this HtmlHelper htmlHelper, string name, object value);
nameパラメータはテキスト枠name属性(及びid属性)の値であり、valueパラメータはテキストボックスのデフォルト値(すなわちvalue属性の値)である.valueパラメータがnullである場合、またはvalueパラメータがない重載方法を使用する場合、nameパラメータは同時にキー値であり、テキストボックスのデフォルト値を取得する責任があります.取得の順序は、まずView Dataからキー値がname値の項目があるかどうかを調べ、View Dataにない場合はView Data.Modelから名前がname値の属性があるかどうかを調べ、まだ存在しない場合はnullに戻ります.(具体的にはHtmlHelperのInputHelper補助方法を参照)
つまり
public ActionResult Test() { ViewData["Name"] = "Jade"; return View(); }
<%= Html.TextBox("Name")%>
このようなコードはこのようなHTMLを出力します.
<input id="Name" name="Name" type="text" value="Jade" />
TextBoxのidとname属性の値はView Dataのいずれかの名前と同じであるため、TextBoxのvalue属性の値は自動的にView DataのName項目の値にバインドされる.View Dataだけでなく、View modelのタイプにはName属性が含まれています.同様の結果が出力されます.
var user = new User { Name = "Jade" }; ViewData.Model = user; return View();
View DataとView Data.Modelの中に同時にNameが存在する場合は、View Dataの中の項目を優先的に使う.
CheckBox、Hdden、Password、RedioButtonなどのコントロールも同じです.TextBoxと同じようにinputマークを使います.属性バインディングのルールは大体同じです.
DropDownListはTextBoxなどのコントロールとは異なり、selectマークを使用しています.2つの値が必要です.プルダウンボックスに表示されるリストと標準オプションです.一度だけ自動バインドするとプロパティが結合されますので、必要に応じてバインディングリストを選択しますか?それともデフォルトのオプションを選択しますか?
DropDownList拡張方法の各キャリアバージョンの「基本的に」は、この方法に伝えられます.
public static string DropDownList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes) {  }
selectListが指定されていない場合、この方法は自動的にリストをバインディングし、即ちView Dataからnameに対応する値を検索する.selectListが提供されたら、自動的にデフォルトオプションをバインドします.つまりselectListからSelected属性がtrueであるSelected ListItemを見つけます.(具体的にはHtmlHelper方法のSelectInternal補助方法を参照)
例1:アクション方法に以下のコードがある場合:
List<SelectListItem> items = new List<SelectListItem>(); 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では、このように使います.
<%=Html.DropDownList("list")%>
支援方法は、まずView Dataからkeyがlistである項目を取得し、IEnumerable<SelectedListItem>タイプであれば、ドロップダウンフレームにバインドされ、そうでなければInvalidOperation Exceptionをスローする.二つ目のSelectListItemのSelectedはtrueであるため、デフォルトでは二つ目が選択されます.
例2:アクション中のコードが次のような場合:
List<SelectListItem> items = new List<SelectListItem>(); 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;
Viewのコードは以下の通りです.
<%=Html.DropDownList("selected", ViewData["list"] as IEnumerable<SelectListItem>)%>
この補助方法は、View Data[list]をプルダウンフレームに結合し、ViewDataからkeyをselectedの項目として取得し、次のlistの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() }); }
これは明らかに私たちが我慢できないことです.何が一番実践的ですか?
AS.NET MVCはDropDownListとListBoxの補助タイプを用意しています.SelectListはMulti SelectListから継承され、後者はIEnumerable<SelectListItem>を実現する.つまり、SelectListは直接Html.DropDownList方法の第二パラメータとして使用することができる.
Multi SelectListは4つの属性を含み、それぞれ:
Items:selectタグに表示されるリストでは、通常、オプトマーク表現を使用します.IEnumerableタイプ.DataText Field:optionのtext項目として、stringタイプ.DataValue Field:optionとしてのvalue項目、stringタイプ.SelectedValues:選択項目の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;
<%=Html.DropDownList("list")%>
もちろん、selectedValueパラメータを持たない構造関数を使って再ロードしてもいいです.また、viewではIEnumerable<SelectListItem>を明示して、ViewDataまたはview modelではDropDownListと同名の他の項目をデフォルトオプションとして指定しています.
最後にDropDownListの3つの使い方を振り返ってみましょう.
IEnumerable<SelectListItem>を作成し、デフォルトの中項目を指定します.IEnumerable<SelectListItem>を確立し、単独のView Data項またはview modelの属性でデフォルトの中から中の項目を指定します.SelectListを使用しますはい、DropDownListの使い方については今日はここまで検討しますが、よろしいですか?