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

问题描述:

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

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

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

+4

它只是向您展示定义,而不是实现。最后注意';'。见[这里](https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs#L544) – Rob

+0

嗨@Rob我相信调用一个点父方法是让父方法中的逻辑处理/使用数据。然而,在这种特殊情况下,只有一个方法定义(如您所指出的那样),并且没有具体的实现。那么为什么还要在第一时间打电话呢? –

+2

您只有可用的方法定义来检查*,但这并不意味着没有实现。很多.NET堆栈都是封闭源码(至少直到最近)。因此,虽然您可能会看到有哪些方法可用,但您无法在方法内看到源代码。你所看到的仅仅是方法定义(即,班级允许你做什么),而不是它如何做。看到我上面的链接到实际的源代码(取决于你的版本,它可能会略有不同)。 – Rob

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

否则,默认情况下,Visual Studio将进入文件,这几乎只是空的定义。 (实施可能会丢失)

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

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

正如你所看到的,执行不空。

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

+0

该死的,就是这样!我右键单击该方法并转到“转到定义”......显然这还不够。这一切都有道理,谢谢Raja! –