2016-04-21 3 views
1

Я присоединяюсь к унаследованному проекту в моей компании - веб-сайту предприятия, разработанному с помощью 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

ответ

5

Это действительно зависит от того, как вы вошли в определение DefaultModelBinder. Этот класс относится к платформе .NET, поэтому вам нужен декомпилятор (JustDecompile и т. Д.), Чтобы изучить полный исходный код (определение + реализация). Этот декомпилятор может быть внешним инструментом или интегрироваться в Visual Studio как Resharper и т. Д. С помощью этих инструментов, когда вы переходите к определению класса, вы можете увидеть весь исходный код.

В противном случае, по умолчанию Visual Studio войдет в файл, который в значительной степени просто содержит пустые определения. (Реализация может отсутствовать)

Реальное определение файла и методу можно увидеть здесь:

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

Как вы можете видеть, реализация не является пустой.

Также обратите внимание, что вызов метода базового класса не является обязательным. Обычно это делается, только для повторного использования логики из базового класса с точки зрения выполнения определенных вещей в 100% случаев, прежде чем применять какую-либо конкретную логику конкретного класса.

+0

проклятье, вот и все! Я щелкнул правой кнопкой мыши на методе и перешел к 'Go To Definition' ... и, видимо, этого было недостаточно. Теперь все имеет смысл, благодаря Радже! –