2016-04-21 68 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等)來查看完整的源代碼(定義+實現)。這個反編譯器可以是一個外部工具,或者作爲Resharper等集成到Visual Studio中。使用這些工具,當您導航到類的定義時,您可以看到整個源代碼。

否則,默認情況下,Visual Studio將進入文件,這幾乎只是空的定義。 (實施可能會丟失)

文件和方法的真正定義,可以在這裏看到:

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

正如你所看到的,執行不空。

另外,請注意調用基類的方法不是強制性的。它通常是完成的,只是在應用任何具體的類特定邏輯之前,在100%的時間內重複使用基類中的邏輯來完成某些事情。

+0

該死的,就是這樣!我右鍵單擊該方法並轉到「轉到定義」......顯然這還不夠。這一切都有道理,謝謝Raja! –

相關問題