Возврат различных типов ViewModel обратно в контроллер - PullRequest
1 голос
/ 15 марта 2012

У меня есть приложение ASP.NET MVC4, в котором в определенный момент есть страница ( Индекс ), где пользователь может выбрать элемент из DropDownList.После отправки этого контроллер вернет другое имя PartialView в другое представление ( Создать ), основываясь на выбранном элементе из списка.Каждый частичный элемент имеет собственную ViewModel, и когда PartialView отправляется с контроллера на Create -View, он отображается правильно.Чтобы достичь этого, я создал общую ViewModel и несколько других ViewModel, которые являются производными от этой общей ViewModel.Представление Create имеет общий ViewModel в качестве модели, а Partials, который будет отображаться в представлении Create , имеет соответствующие производные типы в качестве Model.

Но вот проблема, когда я отправляю форму в PartialView, я должен получить правильную ViewModel обратно в контроллер.Принятие общей ViewModel в качестве параметра не будет работать, так как я не смогу затем привести его вниз к правой ViewModel.Вот пример кода, который у меня есть:

ViewModels:

public class PropertyViewModel
{
    public string ViewName { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }
}

public class IntegerViewModel : PropertyViewModel
{
    public int MinValue { get; set; }
    public int MaxValue { get; set; }
}

public class TextViewModel : PropertyViewModel
{
    public int MaxLength { get; set; }
}

Контроллер:

public ActionResult Create(String partialName)
{
    var model = GetViewModelFromName(partialName);
    return View(model);
}

[HttpPost]
public ActionResult Create(???)
{
    //What to do here and what kind of parameter should I expect?
}

Есть ли«чистый» способ сделать это?И кто-нибудь знает, как этого добиться?

Обновление:

У меня есть решение, которое, кажется, работает.В PartialView я устанавливаю actionName и controllerName формы, например:

@using (Html.BeginForm("CreateIntegerProperty", "Property")) {
    //Formstuff...
}

@using (Html.BeginForm("CreateTextProperty", "Property")) {
    //Formstuff...
}

И в моем контроллере у меня есть все различные действия (по одному для каждого из PartialViews).Это похоже на работу.Теперь это чистый способ сделать это?Если кто-нибудь придумает лучшую идею, пожалуйста, дайте мне знать!

1 Ответ

2 голосов
/ 15 марта 2012

Если ваше решение работает, то иди с ним.Мне кажется, это нормально.Единственная проблема возникла бы, если бы вам надоело иметь один и тот же URL для каждого действия.

Вы могли бы немного улучшить его, добавив имена Action и Controller в базовую ViewModel, если хотите, например, так:

public class PropertyViewModel
{
    public string ViewName { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }
    public String Controller { get; set; }
    public String Action { get; set; }
}

И затем выполните следующее:

@using (Html.BeginForm(Model.Action, Model.Controller)) {
    //Formstuff...
}

Это стоило бы сделать, если бы это означало, что вы теперь можете использовать тот же View (или частичный вид, или любой другой) дляform.

Если вам действительно нужен один и тот же URL-адрес для каждого действия, то один из способов - переопределить OnModelBinding, но я, вероятно, не стал бы беспокоиться лично.

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