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

html-form hidden-field

43760 观看

8回复

660 作者的声誉

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

作者: Brian 的来源 发布者: 2009 年 1 月 16 日

回应 (8)


26

227853 作者的声誉

不同的服务器端技术会有所不同。使用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'] }
作者: Sampson 发布者: 16.01.2009 09:27

18

14037 作者的声誉

如果您有这样的事情:

<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......根据您用来解析查询字符串的服务器软件,这可能不会很好。

作者: DavGarcia 发布者: 16.01.2009 09:28

5

9538 作者的声誉

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

<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和ColdFusion都将值公开为以逗号分隔的列表那么是的,重复的命名是完全有效的。)

作者: Christian Nunciato 发布者: 16.01.2009 09:37

36

75863 作者的声誉

决定

浏览器没问题。但是,应用程序库如何解析它可能会有所不同。

程序应该将具有相同名称的项组合在一起。虽然HTML规范没有明确说明这一点,但在复选框文档中隐含地说明了这一点:

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

作者: Powerlord 发布者: 16.01.2009 09:41

0

31 作者的声誉

我认为这是合法的,至少在收音机按钮和复选框的情况下。当我必须在XSLT中动态添加文本框输入时,我给它们所有相同的名称; 在ASP.NET中,Request.Form [“whatever_name”]是以逗号分隔的所有这些值的字符串。

作者: CaptainJanuary 发布者: 12.07.2013 01:42

2

159932 作者的声誉

HTML5

非规范性部分4.10.1.3配置表单与服务器通信明确说明它是有效的:

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

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

作者: Ciro Santilli 新疆改造中心996ICU六四事件 发布者: 01.06.2016 09:41

2

91 作者的声誉

特别是对于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
)

我希望这有助于一些。

作者: Melo Waste 发布者: 08.07.2016 03:57

0

44 作者的声誉

我刚刚尝试使用相同的控件名称,counties []用于几个SELECT输入,以便英格兰,苏格兰,威尔士和爱尔兰各县的所有县都作为相同参数的值传递。PHP处理得很好,但HTML验证器会发出警告。我不知道所有浏览器是否都会以同样的方式处理这个问题。

作者: Nick Iredale 发布者: 08.05.2017 09:46
32x32