2012-03-07 4 views
2

Я использую MVC, и у меня есть действие контроллера, которое обрабатывает несколько разных моделей просмотров, каждая модель просмотра имеет валидацию, и я бы хотел, чтобы контроллер проверил проверку.Создайте экземпляр неизвестного типа объекта и TryUpdateModel

Это мой контроллер действия:

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

Как изменить этот код так, что тип модели представления можно установить динамически что-то вроде этого:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult WizardCaseResult(FormCollection fc, string ViewType) 
{ 
    ViewType vm = new ViewType(); 
    TryUpdateModel<ViewType>(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 Очень интересный ответ. –

Смежные вопросы