2

我有一个使用大量表单字段的表(HTML 种类——即没有 runat=server)。当回发发生时,它们会填充 Requests.Form 对象,并且它们的插入顺序似乎与它们在页面 HTML 中定义的顺序相同。

这种行为是否记录在案并且跨浏览器保持一致?我希望能够通过索引访问元素,这将提供一种查找字段的简单方法,因为它们可以在客户端插入或删除。

编辑:

表中的每一行都有一个隐藏字段,其中包含行 ID。该字段根据它在渲染时的显示顺序命名。例如,第一行有一个类似的字段<input type="hidden" name="row0" value="RowID_555252" />,依此类推。

当然,只要在表格中间插入或删除一行,行号就会出错,所以我能想到的唯一解决方案是在行移动时使用Javascript更新整个表格的行号. 然后,后端将通过扫描 Request.Form 中的 row0、row1 等按顺序检索行,直到元素为 NULL。

4

2 回答 2

1

这种行为是否记录在案并且跨浏览器保持一致?

不,它没有记录在案,也不能保证在浏览器之间保持一致。这就是它发生的方式恰好是您使用的浏览器的实现细节。

您当然可以使用索引,但您不能假设这将对应于表单元素的顺序。此外,它很脆弱——如果在表单的开头添加一个新字段会发生什么?你的逻辑完全崩溃了。

于 2012-11-13T15:26:41.940 回答
1

这种行为是否记录在案...

是的。

整体算法在这里:http ://dev.w3.org/html5/spec/constraints.html#concept-form-submit这定义了它使用http://dev.w3.orgform data set上的算法构建/html5/spec/constraints.html#constructing-the-form-data-set

虽然该算法相当复杂,但本质上它表示表单元素将按节点顺序放入表单数据集中。这与它们在页面 HTML 中的内容并不完全相同,例如,元素可以通过 JavaScript 移动。

还有其他算法可以将表单数据集转换为查询字符串或 HTTP 内容,但这些也保留了节点顺序。

已知有一些网页依赖于这个顺序。(HTML5 解析器有一个奇怪的怪癖,大多数类型的输入元素,放置在表格内但不在表格单元格内,通过称为养育父母的过程从表格中弹出,但“隐藏”类型的输入元素不会以这种方式弹出. 发生这种情况是因为这是保留浏览器传统提交排序行为的唯一方法。)

...并且跨浏览器保持一致?

提交内容的整个算法肯定是不一致的——例如,众所周知,单击“图像”类型的输入元素所产生的提交内容会有很大差异。

我相信提交元素的顺序可能在浏览器实现中是一致的。但是,我不会依赖它,并鼓励您找到更强大的解决方案。

于 2012-11-13T17:57:18.863 回答