3

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

4

0 回答 0