私は次のViewModelを持っています:
public class ViewModel
{
public Address Address {get;set;}
[DisplayName("State")]
public IEnumerable<SelectListItem> StateSelect { get; set; }
public string StateID { get; set; }
public ViewModel()
{
}
public ViewModel(Stuff s, IDataContext dc)
{
StateSelect = dc.States.ToList().Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
Address = s.Address;
}
そして私の編集ビューで:
<div class="display-field">
@Html.DropDownListFor(model => model.Address.StateID, Model.StateSelect,)
@Html.ValidationMessageFor(model => model.StateSelect)
</div>
私のコントローラー:
public ActionResult Edit(int id)
{
var stuff = context.Stuff.Find(id);
if (stuff== null)
{
throw new Exception("Stuff not found.");
}
return View(new ViewModel(stuff, context));
}
[HttpPost]
public ActionResult Edit(ViewModel model)
{
try
{
if (ModelState.IsValid)
{
//deeper logic, adds to ModelState.AddModelError
if(stillNotValid)
return View(model)
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
これで、私のEdit
ビューでは、ドロップダウンリストが正しく表示されます。ただし、Edit
コントローラーに投稿すると、モデルには常にnullのStateSelectが含まれます。
Edit
検証エラーが発生した場合にドロップダウンを再入力できるように、StateSelectが自分の投稿にプッシュされていることを確認するにはどうすればよいですか?