2011-11-10 4 views
1

원래 모델을 포함하는 숨겨진 값을 기반으로 적절한 모델 하위 형식을 반환하는 데 사용하는 사용자 지정 모델 바인더가 있습니다.다형성 사용자 지정 모델 바인더가 값이있는 모델을 채우지 않음

예를 들어, 내보기 (EditorTemplate)에서 내가 가진 :

@model MyWebApp.Models.TruckModel 
@Html.Hidden("ModelType", Model.GetType()) 
@Html.EditorFor(m => m.CabSize) 

그런 다음 내 사용자 정의 모델 바인더, 내가 가진 다음 typeValuetype 변수로 설정지고

protected override object CreateModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext, Type modelType) 
    { 
     var typeValue = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName + ".ModelType"); 

     var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true); 

     var model = Activator.CreateInstance(type); 

     bindingContext.ModelMetadata = ModelMetadataProviders.Current 
      .GetMetadataForType(() => model, type); 

     return model; 
    } 

적절한 값 (유형은 TruckModel)이지만 GetMetadataForType을 수행 한 후에도 model은 여전히 ​​널 (null)/기본값으로 채워집니다.

몇 개의 게시물 (herehere)을 체크 아웃했는데 여기에 설명 된대로 모든 것을 수행하고있는 것처럼 보입니다. 그러나 여전히 저에게는 효과가 없습니다.

이 항목에 대한 내 previous post을 참조하여보기/모델 설정에 대한 자세한 내용을 확인할 수 있습니다.

+1

이 단계에서 기본값을 기대할 것입니다. GetPropertyValue를 호출 한 후에 모델에 실제로 뷰의 값이 채워진 후에 만 ​​해당 메서드를 단계별로 실행 했습니까? – sydneyos

+0

@sydneyos - 네 말이 맞아,이 시점에서 값이 설정되지 않아야한다. 나는 그것이 내 컨트롤러 (관련없는 예외'ArgumentNullException',하지만 난 관련 있다고 생각하기 전에 그것을 던져지고 예외를 볼 수 없었습니다.) 이 문제를 해결하고 나면 컨트롤러로 넘어갔습니다. 당신이 말했듯이,이 시점에서 제 모델이 채워졌습니다. 답변으로 게시 할 수 있다면 받아 들일 것입니다. 감사. –

답변

0

@sydneyos가 주석에서 위와 같이 언급했듯이 내 모델이 실제로 채워지지만 CreateModel 메서드에서 분명히 반환 된 모델에는 그 시점의 값이 포함되지 않습니다.

필자의 경우 모델이 채워지지 않았기 때문에이 방법을 따르면서 ArgumentNullException이 발생했습니다. 그러나 일단 연관성이없는 것으로 밝혀졌습니다. 일단 수정되면 모델 바인딩이 예상대로 작동합니다.

관련 문제