Вопрос

У меня есть форма, которая содержит целую кучу полей ввода данных, которая будет завершена пользователем, включая некоторые элементы, где пользователь может определить, сколько из тех же элементов они введут. Это так, как используется в записи в блоге Фила Хака Привязка модели с списком.

Я успешно использую jQuery, чтобы создать дополнительные элементы формы, правильно индексировать и т. Д. Моя проблема - лучший способ прочитать их в моем контроллере. Контроллер в статье ожидает только один объект, IList<Product> в то время как мой контроллер уже ожидает FormCollection form И теперь я пытаюсь также прислать ему IList<Itmes> также.

Должен ли я добавить это в параметры, ожидаемые контроллером, или доступа через форму ["элементы"] или что -то еще?

Вид

<form action="/MyItems/Add" method="post">
   <input type="text" name="Title" value="" />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <input id="item[0].Name" name="item[0].Name" type="text" value="" />

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <input id="item[1].Name" name="item[1].Name" type="text" value="" />
</form>

Контроллер

public ActionResult Add(FormCollection form)
{
    string Title = form["Title"];
    List<Item> Items = form["items"].ToList();
}

DTO

public class Item()
{
    int Amount {get; set; };
    string Name {get; set; };
}
Это было полезно?

Решение 2

Я решил работать исключительно с FormCollection вместо того, чтобы мучить воды с некоторыми данными, передаваемыми через использование FormCollection и другие данные, отображаемые в список по структуре. Приведенный ниже код берет элементы и увлажняет DTO вручную. Это прекрасно работает и позволяет мне делать некоторые другие вещи в моем коде, которые были невозможны непосредственно в список.

List<Item> itemList = new List<Item>();
int i = 0;

while ( form["item[" + i + "].Amount"] != null)
{
    itemList.Add(new Item()
        {
            Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i )]),
            Name = form[String.Format("item[{0}].Name",i )]
        });
}

Другие советы

Вы можете просто добавить MyItem в качестве параметра, как SO:

public ActionResult Add(FormCollection form, List<Item> myItem)
{
}

Затем он будет автоматически связываться из данных формы и заполнять параметр myitem.

Я не пробовал это, поэтому вам придется попробовать, но почему бы не использовать метод UpdateModel или TryupDateModel? Это должно связываться так же, как передавать илиста в действие контроллера.

То есть:

public ActionResult Add(FormCollection form)
{
    List<Item> items = new List<Item>();
    TryUpdateModel(items, form);
}

Я не на своем компьютере разработки, поэтому я не уверен, что он сработает, но я ожидаю, что это должно. Дайте мне знать, если это то, что вам нужно.

РЕДАКТИРОВАТЬ: Стоит отметить, что если вы используете структуру сущности, я столкнулся со многими проблемами с методами UpdateModel и прибегал к написанию собственной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top