Сбор данных не отображается в моделях после публикации. (Включает коллекции коллекций.) - PullRequest
1 голос
/ 30 марта 2012

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

class PersonEditorModel 
{
    public List<Person> People;
}

class Person 
{
    public string Name;
    public List<Address> Addresses;
}

class Address
{
    public string Value;
}

Я создаю форму для редактирования адресов и имен, связанных с ними. Он использует Ajax.BeginForm, потому что это упрощенный пример, полученный из проблемы, с которой я столкнулся в более крупном приложении, где форма обновляет другую часть страницы, используя Ajax для получения результата.

В базовой форме cshtml:

@model Models.PersonEditorModel
@using (Ajax.BeginForm("Update", new AjaxOptions { HttpMethod = "Post" }))
{
    <div>
        @Html.EditorFor(x => x.People)
        <button type="submit">Commit Changes</button>
    </div>
}

Person.cshtml:

@model Models.Person
<div> @Html.TextBoxFor(x => x.Name) </div>
<div> @Html.EditorFor(x => x.Addresses) </div>

Address.cshtml:

@model Models.Address
<div> @Html.TextBoxFor(x => x.Value) </div>

Метод контроллера для действия:

public ActionResult Update(List<Person> people) { /* snip */ }

Когда я отправляю эту форму, точка останова, помещенная непосредственно в Update (), показывает, что «people» - это список правильной длины, но он не содержит абсолютно никаких данных - все адреса являются пустыми строками, даже если данные формы как появляется в Request.Form выглядит правильно.

Что может быть причиной такой проблемы и каков идиоматический способ MVC решить эту проблему?

ПРИМЕЧАНИЕ. Это упрощенный пример поведения, которое я наблюдаю в более сложном приложении. Я думаю, что я уловил суть проблемы здесь, но может быть какой-то другой неизвестный осложняющий фактор. Дайте мне знать, что может усложнить это, чтобы вызвать проблему, которую я вижу, и я постараюсь предоставить любую дополнительную информацию, которую я могу.

Я пытался заставить Update принять параметр PersonEditorModel вместо этого, но это вообще не дает никаких данных.

Ответы [ 2 ]

1 голос
/ 30 марта 2012
class Address
{
    public string Value;
}

должно быть:

class Address
{
    public string Value { get; set; }
}

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

Также убедитесь, что имена сгенерированных полей ввода соответствуют стандартному соглашению .

0 голосов
/ 30 марта 2012

Мне кажется, что у вас есть как минимум две проблемы, обе из которых связаны с моделью.Во-первых, объект, отправляемый на ваш вызов, создается автоматически на основе идентификаторов элементов ввода в сгенерированной форме.Например, чтобы извлечь свойство с именем PersonName, где-то должен быть тег, напоминающий

<input type='whatever' id='PersonName' />

. Таким образом, эти свойства должны быть представлены с помощью такого ввода.

Вторая проблема связана с этим первым.Используя встроенные в MVC формы ajax (которые ограничены по сравнению с AJAX в целом (и в jQuery)), нет никакого способа (по крайней мере, я знаю) определить какие-либо коллекции, но особенно не такие общие, как список.Чтобы сделать это с помощью MVC AJAX, вам, вероятно, потребуется реализовать редактор для одного человека / пользователя за раз и передать эти данные (с единичным или перечисляемым числом адресов) обратно.

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

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