2015-09-18 4 views
2

У меня есть частичное представление, в котором есть viewmodel, содержащая форму с только адресом электронной почты и именем. Я отправляю эти данные с помощью jquery ajax на мой контроллер, чтобы выполнить некоторую проверку. Мой контроллер метод PartialViewResult см:Публикация динамически добавленных элементов списка контроллеру

[HttpPost] 
    public PartialViewResult InviteUser(InviteEmailViewModel item) 
    { 
     return PartialView("_InvitedUsers", item); 
    } 

Мой JQuery добавляет результат этого метода к DOM, так как ив использует hiddenfor я получаю входы, как:

<input data-val="true" data-val-required="Name is required." id="Name" name="Name" type="hidden" value="test"> 
<input data-val="true" data-val-regex="Invalid Email Address" data-val-regex-pattern="^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$" data-val-required="Email Address is required." id="Email" name="Email" type="hidden" value="[email protected]"> 

Проблема с этим состоит в том, что мой ViewModel содержит список, но после отправки формы с добавленными частичными просмотрами List имеет значение Null. Ive тестировался с жестко закодированными полями ввода, такими как:

<input data-val="true" data-val-required="Name is required." id="Name" name="InviteEmailViewModel[0].Name" type="hidden" value="test"> 

и это действительно работает. Как заставить MVC генерировать скрытые поля, как в моем жестком кодексе?

ответ

3

Чтобы ответить на ваш Q:

Чтобы включить скрытые поля в этой должности, они должны «выжить» создавание-в-контроллер-уцелеть-на-пост, если поле не в формы, то он не будет отправлен обратно контроллеру, независимо от того, был ли он создан ранее в контроллере.

Добавить скрытое поле в любом месте формы, чтобы оно было отправлено обратно. Поэтому, когда он будет создан, у него будет контейнер, и он будет присутствовать на почте.

IE:

@Html.HiddenFor(m => m.myHiddenField) 
@Html.TextBoxFor(m => m.displayedField, new { @class = "NotHidden" }) 

Что это может быть:

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

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

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

Проблемы, которые у вас есть, с GUID. Он не возвращается через почту без посторонней помощи.

Что вам нужно, это префикс в имени/id, чтобы объект мог быть правильно назначен его модели при публикации.

BeginCollectionItem сортирует это для вас - что вы можете получить «запас» через набрав Install-Package BeginCollectionItem в Package Manager Console в Visual Studio, проверить это руководство - here или вы можете загрузить файл/целиком и добавить его в свой проект вручную, перейдя на сайт GitHub here

name="viewmodel[f7d8d024-5bb6-451d-87e3-fd3e3b8c1bba].listOfObjects[d5c08a43-f65e-46d1-b224-148225599edc].objectProperty" - это то, что вам нужно для динамически созданных свойств модели, чтобы все они связывались при отправке сообщения назад.

Удачи. =)

+0

Спасибо, BeginCollectionItem был трюком.Я установил его и на самом деле не должен был ничего изменять, кроме добавления «@using (Html.BeginCollectionItem (« InviteEmailAddresses »))» к моему частичному представлению. – blaataap

+0

Отлично, рад, что это помогло. – PurpleSmurph