目前我正在阅读MVC 3源代码,试图找出何时设置Controller的ModelState。
从我从Controller.cs看到的代码中,ModelState属性被委托给它的ViewData的ModelStata属性,如下面的代码所示:
public ModelStateDictionary ModelState {
get {
return ViewData.ModelState;
}
}
但是我只能看到ViewData.ModelState似乎只通过Controller.cs中的ValidateModel()方法填充,如下面的代码所示:
protected internal void ValidateModel(object model, string prefix) {
if (!TryValidateModel(model, prefix)) {
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentCulture,
MvcResources.Controller_Validate_ValidationFailed,
model.GetType().FullName
)
);
}
}
在上面的代码中,TryValidateModel()方法将间接填充Controller.ModelState,如下面的代码所示:
foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(metadata, ControllerContext).Validate(null)) {
ModelState.AddModelError(DefaultModelBinder.CreateSubPropertyName(prefix, validationResult.MemberName), validationResult.Message);
}
但是我搜索了所有的源代码,并没有找到任何调用ValidateModel()方法的地方,也没有找到任何调用者访问修饰符,这个方法受到保护,我想知道这个方法在请求期间是如何被MVC 3框架调用的处理,或者ValidateModel()只应由继承的控制器类中的用户调用。