2009-11-14 2 views
2

나는 모두 기본 유형에서 파생 된 클래스 계층 구조를 가지고 있으며 기본 유형도 인터페이스를 구현합니다. 내가하고 싶은 일은 컨트롤러를 통해 노출 된 동작이 동일하므로 전체 계층 구조의 관리를 처리 할 하나의 컨트롤러가 있어야합니다. 그 말은, 나는보기에 그것과 모델 바인더에 숨겨진 필드 값에 바인딩하는 특정 유형의 필드를 가지고 싶어.asp.net mvc 모델 바인더를 일반적으로 사용하기

말했다되고 그건
<input type="text" name="model.DerivedTypeSpecificField" /> 
<input type="hidden" name="modelType" value="MyDerivedType" /> 

에서, asp.net MVC 모델 바인더는 그 이유를 나는 모든 파생 된 유형에 대해 서로 다른 컨트롤러를 만들 필요가 있기 때문에, 그들이 생성 될 구체적인 유형을 필요로하는 것 : 같은 것을.

이런 식으로 행동하기 전에 모델 바인더를 조작하는 방법을 알기 전에이 작업을 수행했거나 아는 사람이 있습니까? 내 자신의 모델 바인더를 작성할 수는 있지만, 대상을 할당 할 때의 기본 모델 바인딩 동작과 대상 배열에 대한 배열을 원하는 것은 아닙니다.

감사합니다. 그것이 작동하는지

답변

3

은 몰라,하지만 당신은 같은 것을 시도 할 수 있습니다 : 기본 모델 바인더의 단순한 변화

public class MyBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelType = System.Type.GetType(controllerContext.HttpContext.Request["modelType"]); 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

합니다.

+0

나는 그것을 알아 냈다. 내 솔루션은 ValueProviders 배열에서 modelType을 가져 오는 것 외에는 거의 동일한 솔루션입니다. 감사! –

2

MvcContrib에서 Derived Type ModelBinder를 확인하십시오. 이를 통해 RenderTypedPartial (...) 도우미를 사용할 때 자동으로 처리되는 'typestamping'프로세스를 통해 파생 된 유형에 모델을 바인딩 할 수 있습니다. MvcContrib 부분은 부분 구조 전반에 걸친 바인딩 상태를 유지하므로 Name/Id 접두사가 딥 객체 그래프에서 올바르게 유지 관리됩니다. 템플릿과 같은 다른 메커니즘을 사용하는 경우 직접 입력 스탬프를 처리해야합니다. 이것은 문서 페이지에서 설명합니다.

다시 질문하고 ModelBinder를 사용하여 파생 형식을 해결하는 방법은 파생 형식 변형을 WCF KnownTypeAttribute와 유사한 메커니즘의 특성으로 등록하거나 시작시 등록을 수행 할 수 있습니다. 어느 쪽이든, 이러한 유사 콘텐츠는 한 번 등록되고 성능 고려 사항으로 유지됩니다.

모델 바인더는 데이터 주석/유효성 검사 특성을 방해하지 않는 방식으로이 문제를 해결합니다. 다른 시나리오에서는 예상대로 작동합니다.

관련 문제