Отправка элементов формы с тем же именем - PullRequest
10 голосов
/ 13 января 2009

У меня есть форма, которая позволяет пользователю создавать дополнительные «строки», используя JQuery (используя .clone), чтобы они могли решить, сколько из той же информации им нужно предоставить. Моя проблема в том, что я не могу понять, как получить доступ к этим элементам формы в моем контроллере.

отправляемая форма может выглядеть следующим образом

<input type="text" name="Amount" id="Amount">
   <select name="Item">
       <option value="1">Item 1"</option>
       <option value="2">Item 2"</option>
       <option value="3">Item 3"</option>
   </select>
<input type="text" name="Amount" id="Amount">
   <select name="Item">
       <option value="1">Item 1"</option>
       <option value="2">Item 2"</option>
       <option value="3">Item 3"</option>
   </select>
<input type="text" name="Amount" id="Amount">
   <select name="Item">
       <option value="1">Item 1"</option>
       <option value="2">Item 2"</option>
       <option value="3">Item 3"</option>
   </select>

По сути, блок между input и выбором может повторяться бесконечное количество раз. Когда я отправляю в контроллер, я использую FormCollection form для доступа к элементам формы. оттуда я не уверен, как я могу получить доступ к элементам, которые были представлены. Я думал об использовании цикла for, а затем доступ к ним через что-то вроде формы ["Amount"] [i], но, очевидно, это не сработает.

Правильно ли я поступаю, и если да, есть ли у кого-нибудь предложения о том, как это может работать?

Заранее спасибо.

Ответы [ 6 ]

15 голосов
/ 28 июня 2012

Старый вопрос, но все же ... Вы можете получить отправленные значения в виде массива, вызвав Request.Form.GetValues или Request.QueryString.GetValues. Например:

string[] amounts = Request.Form.GetValues("Amount");

И массив amounts будет содержать правильные значения, так что вы можете публиковать значения, содержащие запятые, точки, что угодно, и не беспокоиться о разбиении / разборе.

Конечно, если вы работаете с MVC, используйте связыватель моделей, чтобы сделать это. Но вы можете использовать это, если вы используете веб-формы, универсальный обработчик и т. Д ...

9 голосов
/ 13 января 2009

Проверить Привязка модели к списку . Ваш метод действия должен быть:

public ActionResult MyAction(string[] Amount, int[] Item){
   // ...
}

Однако это заставит вас "связать" предметы. Или создайте класс "Item":

public class Item {
    public string Amount { get; set; }
    public int Item { get; set; }
}

И

public ActionResult MyAction(IList<Item> items){
   // ...
}

И ваша разметка должна быть:

<input type="hidden" name="items.Index" value="0" />
<input type="text" name="items[0].Amount" id="items[0].Amount">
   <select name="items[0].Item">
        <option value="1">Item 1"</option>
        <option value="2">Item 2"</option>
        <option value="3">Item 3"</option>
   </select>
<input type="hidden" name="items.Index" value="1" />
<input type="text" name="items[1].Amount" id="items[1].Amount">
   <select name="items[1].Item">
        <option value="1">Item 1"</option>
        <option value="2">Item 2"</option>
        <option value="3">Item 3"</option>
   </select>

Etc ...

6 голосов
/ 13 января 2009

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

Чтобы получить доступ к каждому, просто попробуйте:

string[] amounts = Request.Form["Amount"].Split(new char[] { ',' });

Имейте в виду, однако, что входные данные не очищаются при отправке, поэтому, если кто-то введет запятую в текстовое поле, это вызовет проблемы.

Поэтому я бы порекомендовал нумеровать их.

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

Я понял, что ( blush ) механизм, который JQuery использует для нахождения строки в клонированной строке (для замены), в основном является регулярным выражением. Таким образом, мне просто нужно было убрать квадратные скобки и точку. Как только я это сделал, я смог использовать JQuery для создания формы, как подсказал блог Фила Хаака.

В мой следующий номер ...!

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

Вы можете изменить атрибуты id и name входных данных на что-то вроде «Amount [1]», «Amount [2]», «Amount [3]» (да, атрибут id и name может содержать специальный chars "[" или "]"). Затем в контроллере напишите синтаксический анализатор параметров запроса http, чтобы получить суммы в виде коллекций.

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

Я бы назвал их Сумма1, Сумма2, Сумма3 и т. Д.

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