【问题标题】:how to pass params using action button in grails如何使用 grails 中的操作按钮传递参数
【发布时间】:2012-07-19 14:51:35
【问题描述】:

对有动作的按钮有问题。我有几个 btns,我想知道它的参数。在 grails 教程中它说应该是这样的:

 <g:actionSubmit    action="action" value="${message(code: 'default.button.edit.label', default: 'Edit')}" params="['actionTaken':editPhone]"/>

我尝试使用 remotelink、submitButton、submitToRemote 标记,但没有一个有效。当我尝试在控制器中解析它时,我总是得到 null:

def action=
    {
        def actionTaken = params.actionTaken
        def employeeId= params.employeeId

        MySession session = MySession.getMySession(request, params.employeeId)
        profileInstance = session.profileInstance

        switch(actionTaken)
        {
            case "editPhone" :
                isEditPhone=true
                break

            case "editEmail" :
                isEditEmail=true
                break
        }
        render(view:"profile", model:[profileInstance:session.profileInstance, isEditPhone:isEditPhone, isEditEmail:isEditEmail])
    }

我错过了什么?我的参数代码错了吗?我解析参数的代码错了吗?这只是让我陷入没有进展的圈子。帮助。谢谢。

【问题讨论】:

  • 你试过了吗。也许我在 params 属性上忘记了 {},如果它不起作用,请尝试将它们放在 [{}]{[]} 我不记得正确现在怎么样了。对不起

标签: grails button submit action params


【解决方案1】:

params 属性被解析为映射,其中 keys 被视为字符串,而 values 被视为表达式。因此

params="['actionTaken':editPhone]"

正在尝试将名为 actionTaken 的键定义为具有来自 GSP 模型中名为 editPhone 的变量的值。由于没有这样的变量,您将获得空值。所以解决方法是移动引号:

params="[actionTaken:'editPhone']"

这会将值设置为字符串“editPhone”。

【讨论】:

  • 实际上,在我在这里发帖之前我已经这样做了,但仍然为空。 :(
【解决方案2】:

Grails documentation 没有将params 列为actionSubmit 接受的属性之一。

可以通过利用标签实际所做的事情,在控制器的参数列表中注入你想要的值:

def editPhone = { forward(action:'action', params:[actionTaken: 'editPhone'])}
def editEmail = { forward(action:'action', params:[actionTaken: 'editEmail'])}

您可能还只想将完全独立的逻辑编码到 editPhoneeditEmail 操作中,如果这样可以使您的代码更清晰。

更新查看代码:

<g:actionSubmit action="editPhone" value="${message(code: 'default.button.edit.label', default: 'Edit')}" />

【讨论】:

    【解决方案3】:

    我刚刚遇到了一个类似的问题(我需要连同一个 id 一起提交删除)并找到了一个使用 HTML5 的“formaction”属性提交输入的解决方案。 它们可以被赋予一个值,可以包括控制器、动作、附加参数等。

    一般来说,向提交按钮添加参数(例如编辑表单上的特定子对象)如下所示:

    <input type="submit" formaction="/<controller>/<action>/<id>?additionalParam1=...&additionalParam2=..." value="Action" >
    

    在你的例子中:

    <input type="submit" formaction="action?actionTaken=editPhone" value="${message(code: 'default.button.edit.label', default: 'Edit')}" >
    

    【讨论】:

      【解决方案4】:

      您也可以使用

      在 POST 数据中传递参数
      <input type="hidden" name="actionTaken" value="editPhone" />
      

      在表格内。然后它也可以通过 params 变量访问。 它对我有用。

      【讨论】:

      • 这是正确的答案恕我直言。您必须记住 的上下文在表单中,并且表单将被提交到 标记中列出的操作。
      【解决方案5】:

      在我的情况下,我有一个表单元素,在表格的每一行上都有多个操作(即数据表编辑按钮)。发送整个表单数据很重要,所以我不能只使用链接。我发现注入参数的最快方法是使用 javascript。不理想,但它有效:

      function injectHiddenField(name, value) {
          var control = $("input[type=hidden][name='" + name + "']");
          if (control.size() == 0) {
              console.log(name + " not found; adding...");
              control = $("<input type=\"hidden\" id=\"" + name + "\" name=\"" + name + "\">");
              $("form").append(control);
          }
          control.val(value);
      }
      

      您的按钮可能如下所示:

      <g:each in="${objects}" var="object">
           ...
           <g:actionSubmit value="edit" action="anotherAction"
                           onclick="injectHiddenField('myfield', ${object.id})"/>
      </g:each> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-12
        • 2017-02-21
        • 2022-01-17
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        相关资源
        最近更新 更多