2012-02-22 3 views
0

Мой вопрос очень похож на this one. Приложение, которое я разрабатываю, написано в 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; } 
} 

My View подобен ниже.

@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, который является нулевым.

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

ответ

1

1) Шаблон редактора "to" не повторен ndering anything

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

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

Спасибо за вашу помощь Дарин, часть 1 моей проблемы была решена! Что касается префиксов полей ввода, то предоставленное вами решение работает, однако это означает, что если я верну представление и предоставил ему обновленную модель, все поля FirstName получат значение, которое я ввел вместо одной формы I отредактирован. (Я надеюсь, что я достаточно хорошо себя чувствую, чтобы его понимали.) – Geekatron

+0

Я решил проблему, используя RedirectToAction («Index») вместо возврата View («Index», model). Спасибо Дарин! – Geekatron

0

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

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

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

@model IEnumerable<Store.ViewModels.ToDetailsViewModel> 

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

@foreach(model in Model){} 
+0

К сожалению, я пробовал, да. Поскольку форма «to» появляется несколько раз на странице, связующее устройство модели путается и заполняет все поля «FirstName» с представленным вводом. Это связано с тем, что имена входов одинаковы для каждой формы. – Geekatron

+0

Кроме того, передача списка моделей вида в помощник EditorFor() должна обрабатывать создание полей с разными именами. Например: «To_0__FirstName» и «To_1__FirstName». – Geekatron

+0

Тогда как насчет использования кнопки отправки просто используйте и напишите jQuery, чтобы получить информацию и отправить через jQuery – Jayanga

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