为什么我们需要在 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 中的逻辑。
我正在加入我公司的遗留项目,这是一个使用 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 中的逻辑。