문제

왜 MVC가 내가 가지고있는 경우에 MVC가 올바르게 바인딩되지 않는지 디버깅하는 데 약간의 어려움을 겪고 있습니다 ...

기본적으로, 나는 복잡한 객체를받는 행동이 있습니다.이 객체는 복잡한 자식 객체 - 활동. .

이제 나는 실제로 가지고있는 시나리오를 정확히 모방 할 수있는 테스트 프로젝트를 설정했습니다.이 테스트 사례에서는 바인딩이 작동합니다 ... 그러나 실제로 프로젝트에서는 활동에 대한 바인딩이 작동하지만 위치에 맞지 않습니다. Locaiton 속성에 중단 점을 넣어 MVC가 활동에서 복잡한 위치 객체를 검색하고 있지만 속성을 설정하지 않는다고 말할 수 있습니다.

문제를 디버깅하려고하지만 추적 할 수없는 MVC v2 미리보기 2 기호에 액세스해야합니다 ... 위치 개체를 꺼내면 실제로 무엇을하고 있는지보고 싶습니다 (일부의 경우에는 일부 이유는 내부적으로 실패하지만 예외를 삼키고 있다고 생각합니다).

내가 여기서 할 수있는 일에 대한 아이디어 ...

Anthony를 건배합니다

업데이트:

좋아, 나는 JW가 제안한 일을하고 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가 위치를 찾고 메타 유형을 일로로 읽지 만 getModelProperties가 기본 모드 바인더 내에서 실행되면 다음과 같은 경우 -

    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은 내가하려는 일을 지원하지 않았을 수도 있습니다.

나는 이것이 실제로 버그라고 말하지는 않지만 인터페이스를 콘크리트 클래스로 교체하려고 시도했지만 잘 작동했습니다. 그러므로 행동은 실제로 내가 기대할 수있는 것이 아니며 약간의 일관성이 없습니다.

이견있는 사람??? 나는이 상속이 표준이 상당히 표준이 아니라고 생각했을 것입니다. 답장을 보내 주셔서 감사합니다.

건배

도움이 되었습니까?

해결책

인터페이스 상속이 작동하는 방식으로 인해이 동작이 설계에 의해 밝혀졌습니다. 인터페이스는 구현을 정의하지 않으므로 ilocation은 ilocationSource의 속성을 "상속"하지 않습니다. 오히려, Ilocation은 구체적인 구현이 구현 해야하는 것을 정의합니다.

이 동작을 정의하는 CLI (Common Language Infrastructure) 사양을 포함한 자세한 내용은 다음을 확인하십시오. http://haacked.com/archive/2009/11/10/interface-ushitance-esoterica.aspx

다른 팁

CodePlex에 게시 된 ASP.NET MVC2 소스 코드를 간단히 언급합니다. 나는 그렇게했는데, 그것은 매우 간단합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top