如何使用grails中的动作按钮传递参数

时间:2012-07-20 10:24:23

标签: grails button submit action params

一直在使用有动作的按钮。我有几个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代码错了吗?解析params的代码是错误的吗?这只是让我圈起来没有进展。救命。感谢。

5 个答案:

答案 0 :(得分:7)

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

可以通过利用实际所做的标记,在控制器的params列表中注入您想要的值:

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')}" />

答案 1 :(得分:4)

params属性被解析为地图,其中被视为字符串,但被视为表达式。因此

params="['actionTaken':editPhone]"

正在尝试定义名为actionTaken的密钥,以获取GSP模型中名为editPhone的变量的值。由于没有这样的变量,你会得到null。所以修复是移动引号:

params="[actionTaken:'editPhone']"

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

答案 2 :(得分:3)

您还可以使用

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

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

答案 3 :(得分:0)

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

通常,要在提交按钮中添加参数(例如编辑表单上的特定子对象),如下所示:

<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 :(得分:0)

在我的情况下,我有一个表格元素,在表格的每一行上都有多个动作(即数据表编辑按钮)。发送整个表单数据非常重要,因此我无法使用链接。我发现注入参数的最快方法是使用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>