2009-11-04 46 views
21

我有不小的困難,更要調試爲什麼MVC是不是在給定的情況下,我有正確的結合...ASP.net MVC v2 - 調試模型綁定問題 - 錯誤?

基本上,我有我的動作,接收一個複雜的對象又具有一個複雜的孩子object - Activity.Location.State(其中Activity是動作期望的複雜對象,Location是複雜的子對象,State只是一個字符串)。

現在我建立了一個測試項目,據我所知可以準確地模擬我的實際場景,在這個測試案例中綁定工程...但在我的實際項目中,綁定到活動的作品,但不是位置...通過在Locaiton屬性中放置斷點,我可以告訴MVC正在從活動中檢索複雜的位置對象,但它不設置任何屬性...

我試圖調試問題,但我需要訪問我無法跟蹤的MVC v2預覽2個符號...我希望看到實際上它在抽出位置對象後究竟做了什麼(出於某種原因,我認爲它可能會在內部失敗但吞嚥例外)。

什麼,我可以在這裏做任何想法...

乾杯 安東尼

UPDATE:

好吧,我做了什麼J.W.建議並直接引用MVC項目...

我發現問題,並有一個非常小的差異,我忽略了...因爲我的結果我發現,MVC目前不支持多層次的INTERFACE繼承說到模型綁定...查看以下...

//MODEL 
public class Location : ILocation 
{ 
    ... 
} 

public interface ILocation : ILocationCore 
{ 
    ... 
} 

public interface ILocationCore //In my sample I didn't have this second level interface 
{ 
    ... 
    //MVC doesn't find any of these properties 
    ... 
} 


public class Activity : IActivity 
{ 
    ... 
} 

public interface IActivity : IActivityCore 
{ 
    ILocation Location { get; set; } //MVC finds this and reads its meta type as an ILocation 
    //Also the implementation of this Location within Activity will always return a instance - our IoC takes care of that, so MVC should never have to create the instance 
} 

public interface IActivityCore 
{ 
    ... 
} 

//CONTROLLER 
public ActionResult Create(Activity activity) 
{ 
} 

因此我發現是MVC找到位置並讀取其元類型作爲ILocation,但是當GetModelProperties是DefaultModelBinder中運行以下發生 -

protected virtual PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     return GetTypeDescriptor(controllerContext, bindingContext).GetProperties(); 
     //This return no properties 
    } 

    protected virtual ICustomTypeDescriptor GetTypeDescriptor(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     return new AssociatedMetadataTypeTypeDescriptionProvider(bindingContext.ModelType).GetTypeDescriptor(bindingContext.ModelType); 
     //bindingContext.ModelType - is ILocation 
    } 

因此,我假設在這一點上,TypeDescriptionProvider不支持這種繼承風格,我很驚訝。另外看看v1源代碼,它看起來像是在v2中引入的 - 但是v1可能無法支持我想要做的事情。

我不會說這是一個真正的錯誤,但我嘗試用具體的類替換我的接口,它工作正常。因此,行爲並不是我所期望的,並且有點不一致。

任何想法???我會認爲這種繼承不是很標準,但會經常發生,足以應付。謝謝回覆。

乾杯

+0

接口不能繼承,只有類可以。接口指定實施要求。如果你說IFoo:IBar,你告訴編譯器「實現IFoo接口的任何類都必須實現IBar接口」。 – ScottKoon

回答

45

原因是接口繼承的工作原理,這種行爲是有意設計的。接口不定義實現,因此ILocation不會「繼承」ILocationSource的屬性。而ILocation只是定義了具體實現必須實現的內容。

對於全部細節,包括CLI(通用語言基礎結構),符合規範定義這種行爲的部分,請上網:http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

+0

我認爲布拉德威爾遜的評論是我總是記住不同並期望適當的行爲。 「Can Do vs A」 –

+0

是的 - 實際上.NET一直缺乏多重繼承 - 很多C++開發人員對平臺的失望。我可以建議獲取面向對象設計的完整概述,然後閱讀一本關於C#的好書。在他們完全瞭解C#之前,通過在MVC上進行開發,原始海報顯然是在嘗試運行。我說這是一個錯誤,會導致很多挫折。 – csharpforevermore

3

我只是簡單的參考了codeplex發佈的asp.net mvc2源代碼。我這樣做,這非常簡單。

當你通過源代碼進行調試時,它會給你更多的理解。