目前我正在阅读 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() 只应该由继承的控制器类中的用户调用。