【问题标题】:Why do we need to call empty virtual method of parent class in ASP.NET MVC为什么我们需要在 ASP.NET MVC 中调用父类的空虚方法
【发布时间】:2016-04-21 00:06:42
【问题描述】:

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

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

【问题讨论】:

  • 它只是向您展示定义,而不是实现。注意最后的;。见here
  • 嗨@Rob我相信调用父方法的目的是让父方法中的逻辑处理/使用数据。但是,在这种特殊情况下,只有一个方法定义(正如您所指出的),没有具体的实现。那为什么要首先调用它呢?
  • 只有方法定义可供您检查,但这并不意味着没有实现。 .NET 堆栈的大部分是封闭源代码的(至少直到最近)。因此,虽然您可能会看到可用的方法,但您看不到方法内的源代码。您所看到的只是方法定义(即类允许您做什么),而不是它是如何做的。请参阅我上面指向实际源代码的链接(取决于您的版本,可能会略有不同)。
  • 谢谢@Rob,这解释得很好:)

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


【解决方案1】:

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

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

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

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

如你所见,实现不是空的。

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

【讨论】:

  • 该死的,就是这样!我右键单击该方法并转到Go To Definition...显然这还不够。现在一切都说得通了,感谢 Raja!
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2020-03-18
  • 2019-03-10
  • 2020-04-03
相关资源
最近更新 更多