2010-04-05 86 views
6

我有一部分表单需要与表单结果的其余部分进行不同的处理。在需要特殊处理的部分中,我需要遍历3个具有相同名称的表单域。他们必须有相同的名字,我不能改变它。我指的是形式的部分看起来是这样的:使用C#迭代具有相同名称的表单域

<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.

如何我是否应该处理同名的表单域?

回答

-1

Request.Form [“Color”]为null,或者在aspx页面上找不到colorName。我无法根据你的代码来判断。否则,它看起来是正确的。什么类型的html元素是“Color?”如果它只是一个html元素,请确保您具有id和name属性。

+1

除非你在做客户端脚本,否则ID不是必需的。 – pdwetz 2010-04-05 21:52:24

+0

这不是它失败的原因。 '我<= Request.Form [“Color”] [i]'只是错误的(int <= char,因为Request.Form []是一个字符串)。问题有HTML代码(至少现在是这样,并且在你的答案发布前三分钟)。 – PhistucK 2014-11-10 11:43:13

0

我会建议将每个表单添加到列表中,并使用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是窗体本身的类名。

我自己没有测试过,所以可能会有一些错误,希望它在一定程度上有所帮助。

0

重要的是要记住,发布的表单值只不过是名称/值集合,其中的值是一个简单的字符串。因此,拥有多个具有相同名称的表单字段没有多大意义。我甚至不知道它是否被允许。

但正如你所说,你不能改变这一点。我在IE和Chrome中进行了一次快速测试,至少在这些浏览器中,他们似乎发送了多个表单字段,其名称与逗号分隔的字符串相同。您可能需要进行更多测试以确保此行为在各浏览器之间保持一致。

考虑到这一点,你可以说:

string colorValues = Request.Form["Color"]; 
string [] colors = colorValues.Split(','); 

的颜色阵列中的每个元素现在对应于被张贴每个输入元素的值。

11

你不需要做任何分割或其他特殊的魔法;你可以简单地从ASP.NET获得一个字符串数组:

string [] values = Request.Form.GetValues(“Color”);

+4

并且不要忘记在使用“值”之前先进行空检查:) – pdwetz 2010-04-05 21:53:25