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?
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
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? –
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