まず、ViewBag / ViewData などの動的なものを避けて、コントローラーからビューにデータを転送するようにしてください。常に厳密に型指定されたビューを使用してください。
したがって、ビューのビュー モデルを作成します。
public class ProductViewModel
{
public int ProductID { set;get;}
public List<SelectListItem> Level1Items { set;get;}
public int Level1SelectedItem { set;get;}
public List<SelectListItem> Level2Items { set;get;}
public int Level2SelectedItem { set;get;}
public List<SelectListItem> Level3Items { set;get;}
public int Level3SelectedItem { set;get;}
public ProductViewModel()
{
Level1Items =new List<SelectListItem>();
Level2Items =new List<SelectListItem>();
Level3Items =new List<SelectListItem>();
}
}
GET アクションで、コレクション項目をこのビューモデル クラスのインスタンスに設定し、それをビューに送信します。
public ActionResult Index()
{
var prodVM=new ProductViewModel();
prodVM.Level1Items=GetItemsForCategory(1);
prodVM.Leve21Items=GetItemsForCategory(2);
prodVM.Leve31Items=GetItemsForCategory(3);
return View(prodVM);
}
GetItemsForCategory メソッドがカテゴリ ID を受け入れ、データ ソースから SelectListItems のリストを返すと仮定します。
public List<SelectListItem> GetItemsForCategory(categoryId)
{
// to do :return the List of SelectListItem for each categoryID
}
強く型付けされたビューで、
@model ProductViewModel
@using(Html.BeginForm())
{
Level 1 :
@Html.DropDownListFor(m => m.Level1SelectedItem ,
new SelectList(Model.Level1Items,"Value", "Text")"Select")
Level 2 :
@Html.DropDownListFor(m => m.Level2SelectedItem ,
new SelectList(Model.Level2Items,"Value", "Text")"Select")
Level3 :
@Html.DropDownListFor(m => m.Level3SelectedItem ,
new SelectList(Model.Level3Items,"Value", "Text")"Select")
<input type="submit" />
}
HTTPPOST アクションでは、Level1SelectedItem プロパティの最初のドロップダウンで選択された値を取得します (他のドロップダウンでも同じです)。
[HttpPost]
public ActionResult Index(ProductViewModel model)
{
if(ModelState.IsValid)
{
//check for model.Level1SelectedItem property value
}
//to do : reload the dropdown items
return View(model);
}