2012-03-07 7 views
2

MVC를 사용하고 있으며 여러 개의 다른 뷰 모델을 처리하는 컨트롤러 작업이 있습니다. 각 뷰 모델의 유효성 검사가 있으며 컨트롤러에서 유효성 검사를 확인하고 싶습니다.알 수없는 유형의 객체 및 TryUpdateModel 인스턴스 만들기

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult WizardCaseResult(FormCollection fc, string ViewType) 
{ 
    ViewType vm = new ViewType(); 
    TryUpdateModel<ViewType>(vm); 
} 

아마 많은 것 : 뷰 모델의 유형이 같은 동적으로 뭔가를 설정할 수 있도록 내가이 코드를 변경하려면 어떻게

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult WizardCaseResult(FormCollection fc) 
{ 
    ViewA vm = new ViewA(); 
    TryUpdateModel<ViewA>(vm); 
} 

:

내 컨트롤러 액션이다 서로 다른보기 모델이므로 각 유형별로 다른 작업이 실제로 불가능합니다.

답변

4

이 작업을 위해 사용자 정의 모델 바인더를 작성해야합니다 다음

public class MyModelBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     var typeValue = bindingContext.ValueProvider.GetValue("viewType"); 
     var type = Type.GetType(
      (string)typeValue.ConvertTo(typeof(string)), 
      true 
     ); 
     var model = Activator.CreateInstance(type); 
     bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type); 
     return model; 
    } 
} 

과 :

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult WizardCaseResult([ModelBinder(typeof(MyModelBinder))]object model) 
{ 
    ... 
} 

이제 당신이해야 할 모든이를 양식이 ViewType를 전송하도록 매개 변수는 인스턴스화하려는 뷰 모델을 가리킬 것입니다.

아, 그리고 당신과 같은 강력한 타이핑 잊을 수있는 유일한 런타임에 알려진 형식을 처리 할 때 다음

ViewType vm = new ViewType(); 
TryUpdateModel<ViewType>(vm); 

당신은 또한 following answer가 도움이 찾을 수 있습니다.

+1

+1 매우 흥미로운 대답입니다. –

관련 문제