我有一个复杂的对象,我正在绑定一个表单。模型绑定器如下所示:
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 中。但是,表单不会使用 theDataAnnotations
或 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
?