Использование шаблонов редактора для отображения нескольких форм - PullRequest
0 голосов
/ 22 февраля 2012

Мой вопрос очень похож на этот . Приложение, которое я разрабатываю, написано на MVC 3 и Razor. Он позволяет пользователям выбирать товары в магазине и отправлять каждый на другой адрес.

Вот мои ViewModels:

public class DeliveryDetailsViewModel
{
    public FromDetailsViewModel From { get; set; }
    public IList<ToDetailsViewModel> To { get; set; }
}

public class DetailsViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

public class FromDetailsViewModel : DetailsViewModel
{
    public string StreetAddress { get; set; }
    public string Suburb { get; set; }
    public string Postcode { get; set; }
}

public class ToDetailsViewModel : DetailsViewModel
{
    public string Message { get; set; }
}

Мой вид похож на ниже.

@model Store.ViewModels.DeliveryDetailsViewModel

@Html.EditorFor(m => m.From)

@Html.EditorFor(m => m.To)

Мое намерение состоит в том, чтобы отобразить коллекцию форм (по одной на товар в корзине), чтобы пользователь мог вводить различные детали доставки. Каждая форма имеет свою собственную кнопку отправки.

Шаблон редактора, который отображает форму «Кому», выглядит следующим образом:

@model Store.ViewModels.ToDetailsViewModel

@using (Html.BeginForm("ConfirmTo", "Delivery"))
{
    @Html.TextBoxFor(m => m.FirstName)
    @Html.TextBoxFor(m => m.LastName)
    @Html.TextBoxFor(m => m.Email)
    @Html.TextBoxFor(m => m.Message)

    <input type="submit" value="Confirm" />
}

Мой контроллер:

public class DeliveryController : Controller
{
    public ActionResult Index()
    {
        var model = new DeliveryDetailsViewModel();
        model.From = new FromDetailsViewModel();
        model.To = new List<ToDetailsViewModel>();
        return View(model);
    }

    public ActionResult ConfirmTo(ToDetailsViewModel toDetails)
    {
        // Save to database.
    }
}

У меня есть пара проблем:

  1. Шаблон редактора "to" ничего не рендерит (хотя раньше). В нем говорится, что типы моделей не совпадают (т. Е. ToDetailsViewModel не совпадает с List<ToDetailsViewModel>), хотя я думал, что шаблоны редакторов должны были добавлять индексы к именам полей ввода, чтобы обеспечить правильное связывание.

  2. При нажатии кнопки «Подтвердить» и отправке первой формы в списке «Кому» контроллер получает модель представления с правильными привязками. Отправка любой из следующих форм (с индексом 1 или выше) вызывает действие ConfirmTo и передает значение ToDetailsViewModel, равное нулю.

Буду признателен за любую помощь, и если вам нужна дополнительная информация о проблеме, с которой я сталкиваюсь, или о коде, который я использую, не стесняйтесь спрашивать.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

1) Шаблон редактора "to" ничего не рендерит

В вашем действии контроллера вы ничего не добавили в список.Вы только что создали это.Поэтому поместите несколько элементов:

model.To = new List<ToDetailsViewModel>();
model.To.Add(new ToDetailsViewModel());
model.To.Add(new ToDetailsViewModel());
...

2) При нажатии кнопки «Подтвердить» и отправке первой формы в списке «Кому» контроллер получает модель представления с правильными привязками.Отправка любой из следующих форм (с индексом 1 или выше) вызывает действие ConfirmTo и передает значение ToDetailsViewModel, которое является нулевым.

Я был бы удивлен, если бы это работало даже для первого элемента, поскольку поля вводав настоящее время нет правильных имен.Все они имеют префикс To[someIndex], тогда как ваш ConfirmTo ожидает плоскую модель, а не коллекцию.

Таким образом, вы можете установить префикс для пустой строки, чтобы в вашем ~/Views/Shared/EditorTemplates/ToDetailsViewModel.cshtml генерировались правильные входные элементы.шаблон редактора:

@model ToDetailsViewModel
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "";
}
@using (Html.BeginForm("ConfirmTo", "Home"))
{
    @Html.TextBoxFor(m => m.FirstName)
    @Html.TextBoxFor(m => m.LastName)
    @Html.TextBoxFor(m => m.Email)
    @Html.TextBoxFor(m => m.Message)

    <input type="submit" value="Confirm" />
}
0 голосов
/ 22 февраля 2012

1) Вы попробуете это, потому что ваша модель просмотра имеет

public IList<ToDetailsViewModel> To { get; set; }

To - это список, поэтому шаблон вашего редактора должен иметь

@model IEnumerable<Store.ViewModels.ToDetailsViewModel>

и шаблон должен использовать foreach

@foreach(model in Model){}
...