Forms 提交错误数据后,如何处理浏览器中的URL变为动作值?

Forms 提交错误数据后,如何处理浏览器中的URL变为动作值?,forms,http,grails,web-applications,language-agnostic,Forms,Http,Grails,Web Applications,Language Agnostic,这个问题通常与语言/框架无关,但如果有关系的话,我会使用Grails,并且最感兴趣的是Grails特定的解决方案(如果存在的话) 有一个表单映射到URL:/foo/create。当用户在浏览器中键入此URL时,将显示表单 表单操作属性指向/foo/save,并具有方法POST。如果保存成功,则应用标准的后重定向获取模式,并将用户重定向到/foo/show 但是,如果用户指定的数据不正确,他们应该再次看到相同的表单,并显示错误消息,同时保留所有数据。为了实现此行为,我将转发到生成表单的控制器(该表

这个问题通常与语言/框架无关,但如果有关系的话,我会使用Grails,并且最感兴趣的是Grails特定的解决方案(如果存在的话)

有一个表单映射到URL:
/foo/create
。当用户在浏览器中键入此URL时,将显示表单

表单操作属性指向
/foo/save
,并具有方法
POST
。如果保存成功,则应用标准的后重定向获取模式,并将用户重定向到
/foo/show

但是,如果用户指定的数据不正确,他们应该再次看到相同的表单,并显示错误消息,同时保留所有数据。为了实现此行为,我将
转发到生成表单的控制器(该表单映射到
/foo/create

在该用户看到包含数据和错误消息的表单之后,但浏览器中的URL字段更改为
/foo/save
。如果用户将焦点更改为URL字段并按enter键,则将显示-404(因为没有任何内容映射到
/foo/save
+
方法=GET
对)

长话短说:URL
/foo/save
显示在浏览器中(因为表单提交后没有重定向),但如果通过HTTP GET方法访问,它将不会指向任何地方

如何处理这种情况?当然,我可以将某些内容映射到
/foo/save
,但我想知道是否有一种方法可以在提交数据错误的表单后不更改浏览器中显示的URL?

两种方法:

  • 表单提交到自身,即
    /foo/create
    提交到
    /foo/create
    ,仅当页面成功重定向到
    /foo/show
    时。这也应该使用post-redirect-get循环,并将提交的数据存储在会话中,但也可以是没有重定向的简单post
  • /foo/save
    始终再次重定向,如果数据无效,则重定向到
    /foo/create
    ,如果数据有效,则重定向到
    /foo/show
    。这将始终使用会话中保存的数据的后重定向获取周期