2009-11-04 3 views
21

내가 MVC 내가이 주어진 경우에 제대로 결합되지 않는 이유 디버깅하려고 약간의 어려움보다 더 많은 데 ... 기본적으로ASP.net MVC v2 - 모델 바인딩 문제 디버깅 - BUG?

, 나는 다시 복잡한 아이가 복잡한 객체를 받아 내 행동이 object - Activity.Location.State (여기서 Activity는 동작이 예상하는 복잡한 객체이고 Location은 복잡한 자식 객체이며 State는 문자열입니다).

지금까지 필자가 실제로 시나리오를 모방 할 수있는 테스트 프로젝트를 설정했는데,이 테스트 케이스에서는 바인딩 작업이 ... 실제로는 내 프로젝트에서 액티비티 바인딩이 작동하지만 위치 ... Locaiton 속성 내에서 중단 점을 둠으로써 MVC가 Activity에서 복잡한 Location 객체를 가져 오는 중임을 알 수 있지만 속성을 설정하지 않습니다. ...

문제를 디버그하려고하지만 추적 할 수없는 MVC v2 미리보기 2 기호에 대한 액세스가 필요합니다 ... 일단 위치 개체를 꺼내면 실제로 무엇을하는지 보려합니다 (어떤 이유로 인해 내부적으로 실패 할 수도 있습니다). 그러나 예외를 삼키기).

내가 여기서 무엇을 할 수 있는지에 어떤 아이디어 ...

건배 앤서니

UPDATE :

좋아, 내가 무슨 짓을했는지 J.W. 제안 및 직접 MVC 프로젝트를 참조하십시오 ...

내가 발견 한 하나의 아주 작은 차이가 있었는지 ... 내가 결과로 MVC는 현재 인터페이스 상속의 여러 수준을 지원하지 않는 것으로 나타났습니다 ... 참조 바인딩 모델에 관해서 다음과 같은 ... 내가 찾은 따라서 어떤

//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 대 A입니다" –

+0

예 - 사실 .NET은 항상 다중 상속이 부족합니다. 많은 C++ 개발자가 플랫폼에 오는 것을 좌절감으로 만듭니다. 객체 지향 디자인에 대한 전체 개요를 얻은 다음 C#에서 좋은 책을 읽는 것이 좋습니다. 원래 포스터는 C#을 완전히 이해하기 전에 MVC로 개발함으로써 걸을 수 있기 전에 분명히 실행하려고합니다. 나는 이것이 실수이며 많은 좌절로 이어질 것이라고 말한다. – csharpforevermore

3

는 단순히 코드 플렉스에 게시 된 asp.net의 MVC2의 소스 코드를 참조 할 것. 나는 그것을했다, 그것은 매우 간단하다.

소스 코드를 통해 디버깅 할 때 더 잘 이해할 수 있습니다.