我知道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是在Form标签中定义的,而不是在每个单独的提交按钮中,所以我们唯一的选择是发布到一个通用URL,然后开始“if…then…”Else”来确定提交的按钮的名称。不是很优雅,但这是我们唯一的选择,因为我们不想依赖JavaScript。
唯一的问题是,按下“删除”,将提交所有的表单字段在服务器上,即使这个操作唯一需要的是一个隐藏的输入与后id。在这个小例子中不是什么大问题,但我在我的LOB应用程序中有数百个(可以说)字段和选项卡的表单,(由于需求)必须一次性提交所有内容,在任何情况下,这似乎非常低效和浪费。如果表单嵌套被支持,我至少能够将“Delete”提交按钮包装在它自己的表单中,只有post-id字段。
你可能会说“只是实现‘删除’链接,而不是提交”。这在很多层面上都是错误的,但最重要的是,像“Delete”这样的副作用操作永远不应该是GET请求。
所以我的问题是(特别是对那些说他们不需要表单嵌套的人)你会做什么?有什么优雅的解决方案,我错过或底线真的是“要么需要JavaScript或提交一切”?