У меня есть сложный объект, который я связываю с формой. Модель переплета выглядит так:
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
?