現在、MVC 3 ソース コードを読んで、コントローラーの ModelState がいつ設定されているかを調べています。
以下のコードのように、ModelState プロパティが ViewData の ModelStata プロパティに委譲されていることを Controller.cs から確認できます。
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() は、継承されたコントローラー クラスでユーザーによってのみ呼び出されることになっています。