我正在加入我公司的遗留项目,这是一个用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);
这是什么意思? 为什么要调用父类的空方法?
答案 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%的时间内重复使用基类中的逻辑。