拥有一个具有多个具有相同名称的"隐藏"控件元素的HTML表单是否合法?我希望在服务器上获取所有这些元素的值.如果是合法的,主流浏览器是否正确实现了行为?
浏览器没问题.但是,应用程序库如何解析它可能会有所不同.
程序应该将具有相同名称的项组合在一起.虽然HTML规范没有明确说明这一点,但在复选框的文档中隐含地说明了这一点:
表单中的多个复选框可以共享相同的控件名称.因此,例如,复选框允许用户为同一属性选择多个值.
不同的服务器端技术会有所不同.使用PHP,您可以使用数组样式语法来强制在服务器端创建集合.如果发布到服务器,$_POST['colors']
将是一个包含两个值的数组,#003366
并且#00FFFF
:
一般来说,您需要使用不带方括号的标准名称.大多数服务器端技术都能够解析结果数据,并提供某种类型的集合.Node.js通过querystring.parse
以下方式提供有用的功能:
const querystring = require('querystring')
querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] }
如果您有这样的事情:
您的查询字符串将看起来像x=1&x=2&x=3
......根据您用来解析查询字符串的服务器软件,这可能不会很好.
是的,大多数应用程序服务器将收集匹配的元素并用逗号连接它们,这样的形式如下:
...将解析为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都将这些值公开为以逗号分隔的列表.所以是的,重复的命名是完全有效的.)