2016-04-21 4 views
1

Ich bin ein Legacy-Projekt in meinem Unternehmen, eine Enterprise-Website mit ASP.NET MVC entwickelt.Warum müssen wir leere virtuelle Methode der Elternklasse in ASP.NET MVC anrufen

Wie ich bin neu in C# und Rahmen (ich von einem Java-Hintergrund bin), habe ich verstehen diese besondere Stück Code fehlgeschlagen:

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... 
} 

Nun, ich habe mich gefragt, was base.OnModelUpdated(....) Anruf tut , so ging ich in die Definition von DefaultModelBinder, vor nur OnModelUpdated(), um herauszufinden, eine virtuelle Methode mit leerer Methode Körper war:

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

Was ist der Sinn dieses? Warum ruft es eine leere Methode einer Elternklasse auf?

+4

Es zeigt Ihnen nur die Definition, nicht die Implementierung. Beachte das '' 'am Ende. Siehe [hier] (https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs#L544) – Rob

+0

Hallo @Rob Ich glaube, der Punkt des Aufrufs einer Übergeordnete Methode besteht darin, dass die Daten von der Logik in der übergeordneten Methode verarbeitet/konsumiert werden. In diesem speziellen Fall gibt es jedoch nur eine Methodendefinition und keine konkrete Implementierung. Warum sollte man es dann überhaupt anrufen? –

+2

Es gibt nur die Methodendefinition, die Ihnen * zur Verfügung steht, um zu inspizieren *, aber das bedeutet nicht, dass es keine Implementierung gibt. Ein Großteil des .NET-Stacks war Closed Source (zumindest bis vor kurzem). Während Sie sehen können, welche Methoden verfügbar sind, können Sie den Quellcode in der Methode nicht sehen. Was Sie sehen, ist einfach die Methodendefinitionen (dh was die Klasse Ihnen erlaubt), aber nicht wie es das tut. Siehe meinen obigen Link zum tatsächlichen Quellcode (abhängig von Ihrer Version, kann es leicht variieren). – Rob

Antwort

5

Es hängt wirklich davon ab, wie Sie in die Definition von DefaultModelBinder gingen. Diese Klasse gehört zum .NET-Framework, und daher benötigen Sie einen Decompiler (JustDecompile usw.), um in den vollständigen Quellcode (Definition + Implementierung) zu schauen. Dieser Decompiler kann ein externes Tool sein oder als Resharper usw. in Visual Studio integriert sein. Mit diesen Tools können Sie beim Navigieren zur Definition der Klasse den gesamten Quellcode sehen.

Andernfalls wird standardmäßig Visual Studio in die Datei gehen, die ziemlich einfach leere Definitionen haben wird. (Implementierungen fehlen)

Die eigentliche Definition der Datei und Verfahren hier zu sehen ist:

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

Wie Sie sehen können, die Umsetzung nicht leer ist.

Beachten Sie auch, dass der Aufruf der Methode der Basisklasse nicht obligatorisch ist. Es ist normalerweise getan, nur um die Logik von der Basisklasse in Bezug auf das Ausführen bestimmter Dinge in 100% der Zeit wiederzuverwenden, bevor Sie irgendeine konkrete klassenspezifische Logik anwenden.

+0

verdammt, das war es! Ich klickte mit der rechten Maustaste auf die Methode und ging zu 'Go to Definition' ... und das war offensichtlich nicht genug. Alles macht jetzt Sinn, danke Raja! –

Verwandte Themen