【问题标题】:ASP.Net: Is the order of Request.Form elements defined?ASP.Net:Request.Form 元素的顺序是否已定义?
【发布时间】:2012-11-13 15:22:38
【问题描述】:

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

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

编辑:

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

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

【问题讨论】:

  • 我不会这样做,例如,如果复选框 aren't ticked 不会发布任何内容,并且禁用的字段不会发回等等。

标签: asp.net html


【解决方案1】:

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

是的。

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

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

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

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

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

提交内容的整个算法肯定是不一致的 - 例如,通过单击“图像”类型的输入元素所产生的提交是众所周知的。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我希望后端报告字段的视觉顺序。如果用户在表单的开头插入一个表格行,我希望在回发后知道这一点。至少我需要一种方法来保存表格,以便以后可以按照与用户提交表格完全相同的顺序检索它。
    • @Trent - 您需要为此创建自己的机制。但是您确实应该考虑将 UI 与后端代码如此紧密地耦合。也许考虑为每一行添加一个排序字段?
    猜你喜欢
    • 2012-06-20
    • 2016-11-09
    • 1970-01-01
    • 2010-11-23
    • 2015-04-05
    • 2011-10-10
    • 2019-12-02
    • 2012-02-23
    • 2010-11-29
    相关资源
    最近更新 更多