具有多个相同名称的隐藏控制元素的HTML表单

具有多个具有相同名称的“隐藏”控制元素的HTML表单是合法的吗? 我期望在服务器上获得所有这些元素的值。 如果这是合法的,主要的浏览器是否正确地实施了这个行为?

浏览器都可以。 但是,应用程序库如何parsing它可能会有所不同。

程序应该将同名的项目组合在一起。 虽然HTML规范没有明确地说明这一点,但在关于checkbox的文档中隐含地声明:

表单中的多个checkbox可以共享相同的控件名称。 因此,例如,checkbox允许用户为同一个属性select多个值。

不同的服务器端技术会有所不同。 使用PHP,可以使用数组样式的名称语法强制在服务器端创build集合。 如果发布到服务器, $_POST['colors']将是一个包含两个值的数组, #00FFFF#00FFFF

 <input type="hidden" name="colors[]" value="#003366" /> <input type="hidden" name="colors[]" value="#00FFFF" /> 

一般来说,你会想使用没有方括号的标准名称 。 大多数服务器端技术将能够parsing结果数据,并提供一些types的集合。 Node.js通过querystring.parse提供了有用的function:

 const querystring = require('querystring') querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] } 

如果你有这样的事情:

 <input type="hidden" name="x" value="1" /> <input type="hidden" name="x" value="2" /> <input type="hidden" name="x" value="3" /> 

您的查询string会变成x=1&x=2&x=3 …。根据您用于parsing查询string的服务器软件,这可能无法正常工作。

是的,大多数应用程序服务器将收集匹配的元素,并用逗号连接它们,例如:

 <html> <form method="get" action="http://myhost.com/myscript/test.asp"> <input type="hidden" name="myHidden" value="1"> <input type="hidden" name="myHidden" value="2"> <input type="hidden" name="myHidden" value="3"> <input type="submit" value="Submit"> </form> </html> 

…将parsing为一个URL(在GET的情况下 – POST将以同样的方式,虽然),如下所示:

http://myhost.com/myscript.asp?myHidden=1&myHidden=2&myHidden=3

…并且会以这样的代码暴露给你:(例如,像Response.Write(Request.QueryString(“myHidden”)):

1,2,3

所以为了获得这些值,你只需要将string分开,并以数组的forms访问它们(或者用你select的语言进行比较)。

(应该澄清:在PHP中,它稍有不同(正如Johnathan指出的那样,括号表示将项目作为数组展示给您的PHP代码),但是ASP,ASP.NET和CF都将这些值作为以逗号分隔的列表公开。所以是的,重复的命名是完全有效的。)

HTML5

非规范部分4.10.1.3configuration表单与服务器进行通信明确表示它是有效的:

多个控件可以具有相同的名称; 例如,在这里,我们给所有的checkbox同名,服务器通过查看哪个值被提交了这个名称来区分哪个checkbox被选中 – 就像单选button一样,它们也被赋予了唯一的value属性值。

这个规范的版本只是简单地说,它在任何地方都是不被禁止的,表单提交algorithm确切地说明了应该生成的请求:

  • 没有违反约束: https : //www.w3.org/TR/html5/forms.html#constraints
  • 将多个名称依次添加到“表单数据集”中: https : //www.w3.org/TR/html5/forms.html#constructing-form-data-set
  • 编码像application/x-www-form-urlencoded循环遍历“表单数据集”并吐出多个key=val https://www.w3.org/TR/html5/forms.html#url-encoded-form-数据;

特别是对于PHP我做了隐藏input数组名称的一些testing,我在这里分享我的结果:

 <!doctype html> <html> <head> <meta charset="utf-8"> <title>Post Hidden 2D Arrays</title> </head> <body> <form name="formtest" method="POST" target="_self"> <input type="hidden" name="elem['name'][]" value="first"> <input type="hidden" name="elem['name'][]" value="second"> <input type="hidden" name="elem['name'][]" value="third"> <input type="hidden" name="elem['name'][]" value="fourth"> <input type="hidden" name="elem['type'][]" value="normal"> <input type="hidden" name="elem['type'][]" value="classic"> <input type="hidden" name="elem['type'][]" value="regular"> <input type="hidden" name="elem['type'][]" value="basic"> <input type="hidden" name="elem['size'][]" value="4"> <input type="hidden" name="elem['size'][]" value="7"> <input type="hidden" name="elem['size'][]" value="3"> <input type="hidden" name="elem['size'][]" value="6"> <input type="hidden" name="elem['form'][]" value="triangle"> <input type="hidden" name="elem['form'][]" value="square"> <input type="hidden" name="elem['form'][]" value="hexagon"> <input type="hidden" name="elem['form'][]" value="circle"> <input type="submit" name="sendtest" value="Test"> </form> <xmp> <?php print_r($_POST); ?> </xmp> </body> </html> 

我相信这是合法的,至less在单选button和checkbox的情况下。 当我必须在XSLT中dynamic地添加文本框input时,我给他们所有相同的名字; 在ASP.NET中,Request.Form [“whatever_name”]是逗号分隔的所有这些值的string。

我刚刚尝试使用相同的控制名称,县[]为几个SELECTinput,以便在每个英格兰,苏格兰,威尔士和爱尔兰县都是作为相同的参数值传递。 PHP处理它很好,但HTMLvalidation器给出警告。 我不知道所有的浏览器是否会以同样的方式处理。