У меня есть раздел формы, которую я должен обработать по-другому по сравнению с остальной частью результатов формы. В разделе, которому нужна специальная обработка, я должен выполнить итерации более чем 3 полей формы, которые имеют то же имя. У них должно быть то же имя, я не могу изменить его. Раздел формы, к которой я обращаюсь, выглядит примерно так:
<td><input name="Color" size="20" value="" type="text"></td>
<td><input name="Color" size="20" value="" type="text"></td>
<td><input name="Color" size="20" value="" type="text"></td>
Используя C# я пробую что-то вроде этого:
Я пытаюсь обработать его как это:
int i;
for (i = 1; i <= Request.Form["Color"][i]; i++)
{
colorName.Text += Request.Form["Color"];
}
Который приводит к следующему исключению:
System.NullReferenceException: Object reference not set to an instance of an object.
Как я должен обрабатывать поля формы с тем же именем?
Либо Request.Form ["Color"] имеет значение null, либо colorName не найдено на странице aspx. Я не могу сказать, исходя из вашего кода. В остальном все выглядит правильно. Какой тип HTML-элемента имеет значение «Цвет»? Если это просто элемент html, убедитесь, что у вас есть атрибуты id и name.
Важно помнить, что отправленные значения формы являются не чем иным, как коллекцией имя / значение, где значение представляет собой простую строку. Таким образом, не имеет большого смысла иметь несколько полей формы с одним и тем же именем. Я даже не знаю, разрешено ли это на самом деле.
Но, как вы говорите, вы не можете этого изменить. Я провел быстрый тест в IE и Chrome, и, по крайней мере, в этих браузерах кажется, что они отправляют несколько полей формы с тем же именем, что и строка, разделенная запятыми. Возможно, вы захотите протестировать еще немного, чтобы убедиться, что это поведение единообразно во всех браузерах.
Имея это в виду, вы могли бы сказать:
string colorValues = Request.Form["Color"];
string [] colors = colorValues.Split(',');
Каждый элемент в массиве цветов теперь соответствует значению каждого опубликованного элемента ввода.
Вам не нужно делать никаких расколов или другой особой магии; вы можете просто получить массив строк из ASP.NET:
string [] values = Request.Form.GetValues ("Color");
Я бы посоветовал добавить каждую форму в список и вместо этого использовать оператор ForEach, хотя это немного длиннее, чем то, что вы уже пытаетесь сделать.
например,
private List<Request.Form> newList = new List<Request.Form>();
newList.Add(FormName1);
newList.Add(FormName2);
newList.Add(FormName3);
foreach(Request.Form form in newList)
{
//perform logic
}
Примечание: я предполагаю, что Request.Form является имя класса для самой Формы.
Я сам не тестировал это, поэтому в нем может быть несколько ошибок, надеюсь, это в какой-то степени поможет.