フォームからバインドする複雑なオブジェクトがあります。モデル バインダーは次のようになります。
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var form = new MyForm();
var myObject = ...; //try to load up the object
/* logic to populate values on myObject */
form.MyObject = myObject;
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, new ValueProviderResult(form, "", CultureInfo.CurrentUICulture));
return form;
}
そして、それは本来あるべきことをしています。そこから正しく入力MyForm
され、同じ MyForm インスタンスへの参照が ModelState に含まれています。DataAnnotations
ただし、フォームはまたは my検証を使用して検証されませんCustomValidation
。その検証を行うにTryValidateModel()
は、コントローラーに呼び出しを追加する必要があります。
[HttpPost]
public ActionResult ProcessMyForm(MyForm form)
{
//ModelState has the MyForm instance inside of it
//TryValidateModel(ModelState); //this does not work
TryValidateModel(form); //this works
if (!ModelState.IsValid)
{
return View("Complete", form);
}
return RedirectToAction("Index");
}
カスタム検証を呼び出すだけでなく、ModelState.IsValid の値も更新します。
タイトルの質問に加えて、これによりいくつかの質問が発生します。
正しく検証されるフォームの同じインスタンスへの参照があるのに
TryValidateModel(ModelState)
、フォームを検証しないのはなぜですか?ModelState
TryValidateModel(form)
TryValidateModel(form)
の値ModelState.IsValid
が更新されるのはなぜですか?一般に、なぜバインダーが更新を担当するの
ModelState
ですか?