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

时间:2016-04-21 00:06:43

标签: c# asp.net asp.net-mvc inheritance virtual-method

我正在加入我公司的遗留项目,这是一个用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);

这是什么意思? 为什么要调用父类的空方法?

1 个答案:

答案 0 :(得分:5)

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

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

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

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

如您所见,实施不是空的。

另外,请注意,调用基类的方法不是必需的。通常这样做,只是在应用任何具体的类特定逻辑之前,在100%的时间内重复使用基类中的逻辑。