使用具有多个具有相同名称的“隐藏”控件元素的HTML表单是否合法?我希望在服务器上获取所有这些元素的值。如果是合法的,主流浏览器是否正确实现了这种行为?
答案 0 :(得分:36)
浏览器没问题。但是,应用程序库如何解析它可能会有所不同。
程序假设将相同名称的项目组合在一起。虽然HTML规范没有明确说明这一点,但在documentation on checkboxes:
中隐含地说明了这一点表单中的几个复选框可以共享 相同的控件名称。因此,为 例如,复选框允许用户 选择几个相同的值 属性。
答案 1 :(得分:26)
不同的服务器端技术会有所不同。使用PHP,您可以使用数组样式语法来强制在服务器端创建集合。如果发布到服务器,则$_POST['colors']
将是包含两个值#003366
和#00FFFF
的数组:
<input type="hidden" name="colors[]" value="#003366" />
<input type="hidden" name="colors[]" value="#00FFFF" />
一般来说,您需要使用不带方括号的标准名称。大多数服务器端技术都能够解析结果数据,并提供某种类型的集合。 Node.js通过querystring.parse
提供了有用的功能:
const querystring = require('querystring')
querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] }
答案 2 :(得分:18)
如果你有这样的事情:
<input type="hidden" name="x" value="1" />
<input type="hidden" name="x" value="2" />
<input type="hidden" name="x" value="3" />
您的查询字符串将看起来像x=1&x=2&x=3
...根据您用来解析查询字符串的服务器软件,这可能无法正常工作。
答案 3 :(得分:5)
是的,并且大多数应用程序服务器将收集匹配的元素并用逗号连接它们,例如这样的表单:
<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>
...将解析为一个URL(在GET情况下 - POST会以相同的方式工作),如下所示:
http://myhost.com/myscript.asp?myHidden=1&myHidden=2&myHidden=3
...并会在这样的代码中暴露给你:(例如,像Response.Write(Request.QueryString(“myHidden”)之类的东西):
1,2,3
因此,要获取值,您只需拆分字符串并将其作为数组访问(或者使用您选择的语言进行比较)。
(应该澄清:在PHP中,它略有不同(正如Johnathan指出的那样,括号表示法将项目作为数组公开给你的PHP代码),但是ASP,ASP.NET和CF都将这些值公开为逗号 - 分离列表。所以是的,重复的命名完全有效。)
答案 4 :(得分:2)
<强> HTML5 强>
非规范性部分https://github.com/idiap/bob/wiki/Installation明确表示其有效:
多个控件可以具有相同的名称;例如,这里我们给所有复选框命名相同的名称,服务器通过查看使用该名称提交的值来区分检查哪个复选框 - 就像单选按钮一样,它们也被赋予带值属性的唯一值。
这个的规范版本只是在任何地方都没有被禁止,表单提交算法确切地说明应该生成什么请求:
omar@ubuntuv2:~/bob.measure$ sudo python setup.py
Traceback (most recent call last):
File "setup.py", line 50, in <module>
boost_modules = boost_modules,
File "/usr/local/lib/python2.7/dist-packages/bob/blitz/extension.py", line 52, in __init__
BobExtension.__init__(self, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/bob/extension/__init__.py", line 294, in __init__
bob_includes, bob_libraries, bob_library_dirs, bob_macros = get_bob_libraries(self.bob_packages)
File "/usr/local/lib/python2.7/dist-packages/bob/extension/__init__.py", line 186, in get_bob_libraries
pkg = importlib.import_module(package)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/local/lib/python2.7/dist-packages/bob/math/__init__.py", line 6, in <module>
bob.extension.load_bob_library('bob.math', __file__)
File "/usr/local/lib/python2.7/dist-packages/bob/extension/__init__.py", line 237, in load_bob_library
ctypes.cdll.LoadLibrary(full_libname)
File "/usr/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: /usr/local/lib/python2.7/dist-packages/bob/math/libbob_math.so: undefined symbol: dsyevd_
的编码循环遍历“表单数据集”并吐出多个application/x-www-form-urlencoded
https://www.w3.org/TR/html5/forms.html#constructing-form-data-set 答案 5 :(得分:2)
特别是对于php我在隐藏输入中使用数组名称进行了一些测试,我在这里分享我的结果:
<!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>
提交表单会生成下一个结果:
Array
(
[elem] => Array
(
['name'] => Array
(
[0] => first
[1] => second
[2] => third
[3] => fourth
)
['type'] => Array
(
[0] => normal
[1] => classic
[2] => regular
[3] => basic
)
['size'] => Array
(
[0] => 4
[1] => 7
[2] => 3
[3] => 6
)
['temp'] => Array
(
[0] => triangle
[1] => square
[2] => hexagon
[3] => circle
)
)
[sendtest] => Test
)
在查看此结果后,我进行了更多测试,寻找更好的数组值排列并以此结束(我将仅显示新的隐藏输入):
<input type="hidden" name="elem[0]['name']" value="first">
<input type="hidden" name="elem[1]['name']" value="second">
<input type="hidden" name="elem[2]['name']" value="third">
<input type="hidden" name="elem[3]['name']" value="fourth">
<input type="hidden" name="elem[0]['type']" value="normal">
<input type="hidden" name="elem[1]['type']" value="classic">
<input type="hidden" name="elem[2]['type']" value="regular">
<input type="hidden" name="elem[3]['type']" value="basic">
<input type="hidden" name="elem[0]['size']" value="4">
<input type="hidden" name="elem[1]['size']" value="7">
<input type="hidden" name="elem[2]['size']" value="3">
<input type="hidden" name="elem[3]['size']" value="6">
<input type="hidden" name="elem[0]['temp']" value="triangle">
<input type="hidden" name="elem[1]['temp']" value="square">
<input type="hidden" name="elem[2]['temp']" value="hexagon">
<input type="hidden" name="elem[3]['temp']" value="circle">
在提交表格后获得此结果:
Array
(
[elem] => Array
(
[0] => Array
(
['name'] => first
['type'] => normal
['size'] => 4
['temp'] => triangle
)
[1] => Array
(
['name'] => second
['type'] => classic
['size'] => 7
['temp'] => square
)
[2] => Array
(
['name'] => third
['type'] => regular
['size'] => 3
['temp'] => hexagon
)
[3] => Array
(
['name'] => fourth
['type'] => basic
['size'] => 6
['temp'] => circle
)
)
[sendtest] => Test
)
我希望这会有所帮助。
答案 6 :(得分:0)
我认为这是合法的,至少在收音机按钮和复选框的情况下。当我必须在XSLT中动态添加文本框输入时,我给它们所有相同的名称;在ASP.NET中,Request.Form [“whatever_name”]是以逗号分隔的所有这些值的字符串。