ASP.NET MVC - обработка нескольких объектов в одной форме - PullRequest
5 голосов
/ 12 февраля 2009

У меня есть сценарий, на котором я застрял - у меня есть объект домена, к которому прикреплена коллекция объектов. Примерно так:

public class Person
{
   public string Name { get; set; }
   public IList<PhoneNumber> PhoneNumbers {get; set; }
   public IList<Address> Addresses { get; set; }
}

Пользовательский интерфейс, который хочет получить клиент, имеет единую форму ввода для добавления и редактирования. Пользователь может ввести от 0 до нескольких телефонов / адресов для каждого человека. Как мне обработать отправку коллекции значений обратно в контроллер?

Я могу вспомнить пару подходов, но все они кажутся грубой силой и не очень элегантными. Есть ли лучшая практика для решения такого рода проблем?

Ответы [ 5 ]

3 голосов
/ 13 февраля 2009

Поддерживается фреймворком с помощью специальной «разметки формы». У Фила Хаака есть статья на эту тему, проверить это

Редактировать Скотт Хансельман (http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx) только что опубликовал обновление об этом. Кроме того, в RC1 кажется (натолкнулся на этот мизель прошлой ночью), что индексы должны основываться на 0 и неуклонно расти (по крайней мере, если вы являются "обязательными" против IList)

Edit2 Ссылка не работает

0 голосов
/ 27 февраля 2019

Я делал это несколько раз и использовал пост Фила Хаака в качестве руководства. В прошлый раз я понял, как заставить его работать с шаблонами редактора. Размещение этого здесь в надежде, что это поможет кому-то еще в будущем (или мне, если я когда-нибудь забуду).

Мой пример здесь использует адреса (для краткости используем только одно свойство).

AddressViewModel.cs

public class AddressViewModel
{
    public string Address1 { get; set; }
}

AddressViewModels.cs

public class AddressViewModels : List<AddressViewModel>
{
}

PersonViewModel.cs

public class PersonViewModel
{
    public AddressViewModels HomeAddresses { get; set; }
}

AddressViewModel.cshtml (шаблон редактора)

@model AddressViewModel

<div>
    @Html.LabelFor(m => m.Address1)
    @Html.TextBoxFor(m => m.Address1)
</div>

AddressViewModels.cshtml (шаблон редактора)

@model AddressViewModels
@for (var i = 0; i < Model.Count; i++)
{
    @Html.Hidden("Index", i)
    @Html.EditorFor(m => Model[i])
}

Person.cshtml

@model Person

<h3>Edit Addresses</h3>
@Html.EditorFor(m => m.HomeAddresses)
<button type="submit">Save</button>

Визуализированный HTML

<input id="HomeAddresses_Index" name="HomeAddresses.Index" type="hidden" value="0">
<label for="HomeAddresses_1__Address1">Address 1</label>
<input id="HomeAddresses_1__Address1" name="HomeAddresses[1].Address1" type="text" value="P.O.Box 123" >
<button type="submit">Save</button>
0 голосов
/ 13 февраля 2009

В упомянутом посте Хансельмана он пишет, что вам не нужны индексы, у вас просто одно и то же имя для полей ввода и у вас есть параметр массива в действии, и это работает.

0 голосов
/ 12 февраля 2009

Я начал использовать json и jQuery для отправки сложных типов в действие контроллера, используя JSON.NET и JsonFilter на стороне сервера, который автоматически принимает ваш объект json и сериализует его в эквивалентный тип C #. Я обнаружил, что это очень чистое решение, и его легче тестировать. Вы можете проверить этот пост с примером кода для загрузки, чтобы начать, как это сделать. Это довольно просто.

http://blogger.forgottenskies.com/?p=252

0 голосов
/ 12 февраля 2009

В прошлом я использовал для этого соглашение Rails.

<input name="Parent[childObjectType][serial_number]" type="textbox" value="" />

Так что для вашей ситуации это

<input name="Person[PhoneNumber][1]" type="TextBox" value="555-1212" />
<input name="Person[PhoneNumber][2]" type="TextBox" value="555-555-1212" />

и вы можете увеличивать серийный номер и реплицировать элемент в javascript, чтобы получить несколько, и использовать formCollection в своем действии, которое даст вам способ получить эти элементы.

По умолчанию от команды mvc используется ModelBinder и точечный синтаксис для этой операции. Однако это делает jquery и другие фреймворки JavaScript непонятными.

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