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

Bri*_*ian 48 forms hidden-field

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

Pow*_*ord 36

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

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

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

  • 旁注(6年后):ASP.NET使用隐藏的表单字段及其复选框控件,以便它知道复选框控件存在.这是HTML不发送未选中复选框命名的解决方法. (8认同)

Sam*_*son 26

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

<input type="hidden" name="colors[]" value="#003366" />
<input type="hidden" name="colors[]" value="#00FFFF" />
Run Code Online (Sandbox Code Playgroud)

一般来说,您需要使用不带方括号的标准名称.大多数服务器端技术都能够解析结果数据,并提供某种类型的集合.Node.js通过querystring.parse以下方式提供有用的功能:

const querystring = require('querystring')

querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] }
Run Code Online (Sandbox Code Playgroud)

  • 带方括号的东西是PHP的发明,而不是任何类型的Web标准.其他语言和表单读取库具有不同的机制来访问具有相同名称的多个提交,不一定涉及更改这样的名称. (15认同)
  • 如果要将相关详细信息的集合传递到服务器,则此方法非常有用,因为它允许它们作为一组传输,而不是多个独立值. (3认同)
  • 在ASP.net中,可以通过调用`Request.Form.GetValues`来获取发布的值数组。例如:`string [] postedValues = Request.Form.GetValues(“ name_of_the_elements”);`或`Request.QueryString.GetValues(“ name_of_the_elements”)`。 (2认同)

Dav*_*cia 19

如果您有这样的事情:

<input type="hidden" name="x" value="1" />
<input type="hidden" name="x" value="2" />
<input type="hidden" name="x" value="3" />
Run Code Online (Sandbox Code Playgroud)

您的查询字符串将看起来像x=1&x=2&x=3......根据您用来解析查询字符串的服务器软件,这可能不会很好.

  • 如果有人想知道,PHP将**总是**使用此类示例中最后一个输入元素的值 (9认同)
  • 订单保留:http://stackoverflow.com/questions/4027635/do-browsers-preserve-order-of-inputs-with-same-name-on-get-post (7认同)
  • 你知道订单是否已经指定了吗?我只发现它将是一个序列,但不是按照声明的方式排序.你可以得到'x = 2&x = 3&x = 1`吗? (5认同)

Chr*_*ato 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>
Run Code Online (Sandbox Code Playgroud)

...将解析为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都将这些值公开为以逗号分隔的列表.所以是的,重复的命名是完全有效的.)

  • 所以除了PHP,Perl CGI.pm,Python cgi.py,htmlform,django等,Ruby on Rails,Java Servlet ...... (12认同)