Создайте экземпляр объекта неизвестного типа и TryUpdateModel - PullRequest
2 голосов
/ 07 марта 2012

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

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

[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);
}

У меня, вероятно, будет много разных моделей представлений, поэтому о различных действиях для каждого типа действительно не может быть и речи.

1 Ответ

4 голосов
/ 07 марта 2012

Вам нужно будет написать пользовательское связующее для модели, чтобы это работало:

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);

Вам также может пригодиться следующий ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...