【发布时间】:2010-10-10 12:02:27
【问题描述】:
我知道 XHTML 不支持嵌套表单标签,并且我已经在 Stack Overflow 上阅读了有关此主题的其他答案,但我仍然没有找到解决问题的优雅方法。
有些人说你不需要它,他们想不出一个场景是需要它的。好吧,就我个人而言,我想不出一个我不需要需要它的场景。
让我们看一个非常简单的例子:
您正在制作一个博客应用程序,并且您有一个包含一些用于创建新帖子的字段的表单和一个带有“保存”、“删除”、“取消”等“操作”的工具栏。
<form
action="/post/dispatch/too_bad_the_action_url_is_in_the_form_tag_even_though_conceptually_every_submit_button_inside_it_may_need_to_post_to_a_diffent_distinct_url"
method="post">
<input type="text" name="foo" /> <!-- several of those here -->
<div id="toolbar">
<input type="submit" name="save" value="Save" />
<input type="submit" name="delete" value="Delete" />
<a href="/home/index">Cancel</a>
</div>
</form>
我们的目标是以一种不需要 JavaScript 的方式编写表单,只需简单的旧 HTML 表单和提交按钮。
由于操作 URL 是在表单标签中定义的,而不是在每个单独的提交按钮中,我们唯一的选择是发布到通用 URL,然后启动“if...then...else”来确定提交的按钮。不是很优雅,但我们唯一的选择,因为我们不想依赖 JavaScript。
唯一的问题是,按下“删除”,将提交服务器上的所有表单字段,即使此操作唯一需要的是带有 post-id 的隐藏输入。在这个小例子中没什么大不了的,但我的LOB 应用程序中有数百个(可以这么说)字段和选项卡的表单(由于要求)必须一次性提交所有内容,无论如何这似乎非常低效和浪费。如果支持表单嵌套,我至少可以将“删除”提交按钮包装在它自己的表单中,只有 post-id 字段。
您可能会说“只需将“删除”实现为链接而不是提交”。这在很多层面上都是错误的,但最重要的是,这里的“删除”等副作用操作绝不应该是 GET 请求。
所以我的问题(特别是对于那些说他们不需要表单嵌套的人)是你做什么?有没有我遗漏的优雅解决方案,或者底线真的是“要么需要 JavaScript,要么提交所有内容”?
【问题讨论】:
-
这很有趣,但是根据有趣的注释 XHTML 确实允许间接表单嵌套 anderwald.info/internet/nesting-form-tags-in-xhtml - (X)HTML 不允许嵌套表单,如“form > form”,但允许“form > fieldset > form”,W3验证器说它是有效的,但是浏览器存在这种嵌套的错误。
-
@Nishi 评论链接的 linkrot 修复:web.archive.org/web/20170420110433/http://anderwald.info/…