浏览器后退按钮的Grails web流量问题

时间:2010-01-07 16:55:50

标签: grails spring-webflow

我遇到问题,让浏览器的后退按钮在网络流量上正常工作。 grails的版本是1.1.2。 想象一下示例代码:

def someFlow = {
   ...
   fillGroup {
      on("addMember"){
         ...
      }.to "fillMember"
   }
   fillMember {
      on("addMember") {
         ...
      }.to "fillMember"
      on("goToCart").to "showCart"
   }
   showCart {
      ...
   }
}

现在,我添加了群组,几个(> 1)成员并转到购物车。问题是在填充成员期间URL保持不变。仅当状态(视图)更改时,URL执行参数才会更改。

因此,Firefox会将fillMember页面记为一页,因为URL不会更改。因此后退按钮无法正常工作。如果我在showCart上并推回,我会填写会员页面。进一步按下后退按钮返回fillGroup。我需要它来浏览所有的fillMember页面。

有没有办法强制Grails Web流程更改执行参数,即使我重定向到相同的状态?或者我可以将自己的参数放入URL吗?

我发现了一个非常难看的方法:使用两个fillMember状态 - fillMember1和fillMember2,两者都做同样的事情,一个重定向到另一个。但我还需要一个动作状态才能在击退和前进按钮时区分实际状态。这种结构有效,但我更喜欢更简单的方法。

感谢您的回答

汤姆

1 个答案:

答案 0 :(得分:2)

到目前为止,我发现的唯一解决方案是我提到的解决方案。使用两个视图状态,两者都做同样的事情,一个动作状态来保存一些状态信息(没有它就很难正确地区分处理过的成员)。代码将是这样的:

def someFlow = {
   ...
   fillGroup {
      on("addMember"){
         ...
      }.to "fillMemberLogic"
   }
   fillMemberLogic {
      action {
         ...
         flow.stateinf += 1
         if(flow.stateinf%2 == 1)
            return gotoFillMember1()
         else
            return gotoFillMember2()
      }
      on("gotoFillMember1").to "fillMember1"
      on("gotoFillMember2").to "fillMember2"
   }      
   fillMember1 {
      on("addMember") {
         ...
      }.to "fillMemberLogic"
      on("goToCart").to "showCart"
   }
   fillMember2 {
      on("addMember") {
         ...
      }.to "fillMemberLogic"
      on("goToCart").to "showCart"
   }
   showCart {
      ...
   }
}

由于正在为每个成员更改视图,因此也会更改执行参数,并且每个成员的URL都是不同的。 Firefox根据URL区分查看的页面,因此您可以使用后退和前进按钮来回查看所有成员。

Web流将URL与流对象的当前状态映射。因此,在几次后退按钮推动后,很容易区分出正在处理的当前成员。