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

Why do we need to call empty virtual method of parent class in ASP.NET MVC

我正在加入我公司的遗留项目,这是一个使用 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() 是一个 virtual方法 with 空方法体:

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

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

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

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

真正的文件定义和方法可以看这里:

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

如您所见,实现不为空。

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