ViewBagやViewDataなどの動的変数は避けてください。それはあなたのコードを読めなくし、それが成長するにつれて将来維持するのに苦痛を与えるでしょう。ViewBagはマジックストリングのようなものです!
ViewModelアプローチに切り替えます。
たとえば、本を作成するためのビューを作成する場合は、次のようにViewmodel
(単なるクラスです)を作成します。
public class BookViewModel
{
public int BookId { set;get;}
public string BookName {set;get;}
public IEnumerable<SelectListItem> Attributes{ get; set; }
public int SelectedAttribute{ get; set; }
}
GET
アクションで、このクラスのオブジェクトを作成し、BookAttribbutes
プロパティをドロップダウンアイテムに設定して、このViewModelオブジェクトをビューに渡します。
public ActionResult Create()
{
BookViewModel vm=new BookViewModel();
//The below code is hardcoded for demo. you mat replace with DB data.
vm.Attributes=new[]
{
new SelectListItem { Value = "1", Text = "F Cookie" },
new SelectListItem { Value = "2", Text = "Title" },
}
return View(vm);
}
ここで、このViewModelクラスに強く型付けされたビューを作成します
@model BookViewModel
@using(Html.BeginForm())
{
@Html.TextBoxFor(x=>x.BookName)
@Html.DropDownListFor(x => x.SelectedAttribute,
new SelectList(Model.Attributes, "Value", "Text"), "Select Attribute")
<input type="submit" value="Save" />
}
これで、ViewModelの対応するプロパティにアクセスして、HttpPostアクションで選択されたドロップダウン値とテキストボックス値を取得できます。
[HttpPost]
public ActionResult Create(BookViewModel model)
{
if(ModelState.IsValid)
{
//check for model.BookName / model.SelectedAttribute
}
//validation failed.TO DO : reload dropdown here
return View(model);
}