私は2つのアクションを持つコントローラを持っています:
[AcceptVerbs("GET")]
public ActionResult Add()
{
PrepareViewDataForAddAction();
return View();
}
[AcceptVerbs("POST")]
public ActionResult Add([GigBinderAttribute]Gig gig, FormCollection formCollection)
{
if (ViewData.ModelState.IsValid)
{
GigManager.Save(gig);
return RedirectToAction("Index", gig.ID);
}
PrepareViewDataForAddAction();
return View(gig);
}
ご覧のとおり、フォームがデータを投稿するとき、Add アクションは GigBinder (IModelBinder の実装) を使用します。
このバインダーには次のものがあります。
if (int.TryParse(bindingContext.HttpContext.Request.Form["StartDate.Hour"], out hour))
{
gig.StartDate.Hour = hour;
}
else
{
bindingContext.ModelState.AddModelError("Doors", "You need to tell us when the doors open");
}
フォームには、id "StartDate.Hour" のテキスト ボックスが含まれています。
上記のように、GigBinder は、ユーザーが ID "StartDate.Hour" のテキスト ボックスに整数を入力したことを確認するためにテストします。そうでない場合は、AddModelError を使用してモデル エラーがモデル状態に追加されます。
gigs プロパティの gigs.StartDate.Hour は厳密に型指定されているため、ユーザーがフォームのテキスト ボックスにこれを入力した場合、その値をたとえば「TEST」に設定することはできません。
したがって、ユーザーが整数ではなく文字列を入力したため、gigs.StartDate.Hour の値を設定できません。
モデル状態が無効な場合、追加アクションはビューを返し、モデルを渡す (return View(gig);) ため、フォームが検証メッセージで再表示されると、値「TEST」がテキストボックスに表示されません。代わりに、gig.StartDate.Hour のデフォルト値になります。
この問題を回避するにはどうすればよいですか? 本当にくっついた!