带有多个同名隐藏控件元素的HTML表单

时间:2009-01-16 21:22:12

标签: html-form hidden-field

使用具有多个具有相同名称的“隐藏”控件元素的HTML表单是否合法?我希望在服务器上获取所有这些元素的值。如果是合法的,主流浏览器是否正确实现了这种行为?

7 个答案:

答案 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明确表示其有效:

  

多个控件可以具有相同的名称;例如,这里我们给所有复选框命名相同的名称,服务器通过查看使用该名称提交的值来区分检查哪个复选框 - 就像单选按钮一样,它们也被赋予带值属性的唯一值。

这个的规范版本只是在任何地方都没有被禁止,表单提交算法确切地说明应该生成什么请求:

  • 没有违反任何约束:4.10.1.3 Configuring a form to communicate with a server
  • 多个名称一个接一个地添加到“表单数据集”中:https://www.w3.org/TR/html5/forms.html#constraints
  • 类似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”]是以逗号分隔的所有这些值的字符串。