【问题标题】:Grails: calling an action that uses withFormGrails:调用使用 withForm 的动作
【发布时间】:2014-07-23 03:45:07
【问题描述】:

我有一种情况,我需要重用一个将其功能包装在 withForm 闭包中的操作。

提交表单时一切正常,但是当我尝试以另一种方式重用该操作时,我的浏览器出现重定向错误。具体来说,我需要将另一个动作重定向到它,可能用chain 调用它,我还想从超链接调用它。

我真的很想避免创建冗余操作或让invalidToken 闭包执行相同的代码。我试图找到有关withForm 工作原理的更多详细信息,并找出如果没有令牌传递给闭包但谷歌让我失望了会发生什么。

这可能吗?我是否试图让它做一些它不能做的事情?

更多信息:

我有一个用户编辑控制器操作。它用 withForm 闭包包裹。在三种不同的情况下,我需要调用此控制器来呈现用户编辑页面:

  1. 管理员将用户 ID 输入到输入并单击表单 提交按钮(此表单使用 useToken)。这需要得到保障 并防止重复提交表单。
  2. 管理员通过单击从员工列表中选择要编辑的用户 在用户名(超链接)上。有可能我可以用 useToken 把它变成一个表单提交,并做一些 CSS 样式让它看起来像一个链接。
  3. 管理员创建了一个新用户。用户创建成功时 创建控制器重定向(或使用链)到编辑 控制器。除了创建一个冗余控制器之外,我找不到解决此问题的方法。

【问题讨论】:

    标签: forms grails


    【解决方案1】:

    如果您的代码在多个地方使用,则控制器操作不是放置它的最佳位置。我建议您将那段代码移动到 service 并从两个操作中调用它。

    【讨论】:

    • 我理解您所说的将可重用功能转移到服务的内容。在编写控制器时,我会尽量做到这一点。不幸的是,这并不能解决问题。在这种情况下,我需要使用来自同一控制器的相同数据以不同方式加载表单(gsp 文件)。
    • @CheddarMonkey 查看您的编辑,您似乎需要在您的操作中添加一些控制,以确定您是否将它与Form 包装。
    • “一些控制”那个空间不应该在那里 :-) 我能想到的一种方法是在请求中发送一些属性,如果它存在,不要用 withForm 包装它。
    【解决方案2】:

    这是我的解决方案。如果有人对解决此问题的其他方法有一些见解,请贡献。我确定我不是唯一遇到此问题的人。

    答案在很大程度上归功于@Sergio 的回应。这比我想象的要简单得多。我在没有withForm的情况下创建了我的编辑操作,然后从另一个将编辑操作包装在withForm 中的操作调用它。

    def editWT(Long uid, Long pid){
        withForm{
            edit(uid, pid)
        }
    }
    
    def edit(Long uid, Long pid){
        // Do lots of stuff to prep the data for rendering the view
    }
    

    这个答案不是创新的或开创性的,但它确实有效。我希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多