为什么我们需要在ASP.NET MVC中调用父类的空虚拟方法

本文关键字:父类 调用 空虚 方法 虚拟 MVC 我们 NET ASP 为什么 | 更新日期: 2024-10-22 12:07:10

我加入了我公司的一个遗留项目,这是一个使用ASP.NET MVC开发的企业网站。

由于我是C#和框架的新手(我有Java背景),我无法理解这段特定的代码:

internal sealed class ValidatingModelBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext, bindingContext); // This is the damn call I'm stuck with
        var model = bindingContext.Model as IValidatableObject;
        if (model != null)
        {
            ValidateModel(model, bindingContext.ModelState);
        }
    }
    // more methods below...
}

现在,我想知道base.OnModelUpdated(....)调用的作用,所以我继续进行DefaultModelBinder的定义,结果发现OnModelUpdated()是一个虚拟方法,方法体为空:

protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext);

这有什么意义为什么要调用父类的空方法

为什么我们需要在ASP.NET MVC中调用父类的空虚拟方法

这实际上取决于您如何进入DefaultModelBinder的定义。该类属于.NET框架,因此需要一个反编译器(JustDecompile等)来查看完整的源代码(定义+实现)。这个反编译器可以是一个外部工具,也可以作为Resharper等集成到Visual Studio中。使用这些工具,当你导航到类的定义时,你可以看到整个源代码。

否则,默认情况下,VisualStudio将进入该文件,该文件几乎只有空的定义。(可能缺少实现)

文件和方法的真实定义可以在这里看到:

https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs

正如您所看到的,实现并不是空的。

另外,请注意,调用基类的方法不是强制性的。它通常是这样做的,只是在应用任何具体的类特定逻辑之前,在100%的时间内重复使用基类中的逻辑来做某些事情。