Передача контроллера FormCollection и IList <T> - PullRequest
1 голос
/ 16 января 2009

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

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

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

View

<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; };
}

Ответы [ 3 ]

1 голос
/ 16 января 2009

Я решил работать исключительно с FormCollection, а не смазывать воды, когда некоторые данные передаются с использованием FormCollection, а другие данные отображаются в List средой. Приведенный ниже код берет предметы и увлажняет 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 )]
        });
}
1 голос
/ 16 января 2009

Вы можете просто добавить myItem в качестве параметра следующим образом:

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

Затем он автоматически свяжется с данными формы и заполнит параметр myItem.

0 голосов
/ 16 января 2009

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

То есть:

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

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

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

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