如何在Grails中使用操作按钮传递参数

6

我一直在处理一个带有操作功能的按钮问题。我有几个按钮,想知道它们的参数。在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])
    }

我错过了什么?我的参数代码有误吗?我的解析参数的代码有误吗?这只会让我在圈子里打转而没有进展。求助,谢谢。

你试过使用 <g:actionSubmit action="action" value="${message(code: 'default.button.edit.label', default: 'Edit', params:['actionTaken':editPhone])}"/> 吗?也许我在 params 属性上忘记了 {},如果它不能正常工作,请尝试像这样放置它们 [{}] 或 **{[]}**。我现在不记得它是怎样的了,抱歉。 - reixa
5个回答

7

Grails文档没有将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')}" />

4
params属性被解析为一个映射,其中被视为字符串,但被视为表达式。因此,请注意。
params="['actionTaken':editPhone]"

正在尝试将名为actionTaken的键定义为GSP模型中名为editPhone的变量的值。由于没有这样的变量,您得到了null。因此,解决方法是移动引号:

params="[actionTaken:'editPhone']"

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


2
实际上,在我在这里发布之前,我已经做过了,但仍然为空。 :( - user742102

3
您可以通过将参数放在POST-data中传递来实现。
<input type="hidden" name="actionTaken" value="editPhone" />

通过表单内部,然后也可通过params变量访问。这对我有效。


这是我个人认为的正确答案。你必须记住<g:actionSubmit>的上下文是在一个表单内,而且该表单将被提交到<g:actionSubmit>标签中列出的操作。 - nby

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> 

0

我之前遇到了类似的问题(需要提交一个带有ID的删除请求),后来通过使用HTML5的"formaction"属性解决了这个问题。

可以给submit-inputs设置一个值,其中包括控制器、操作、附加参数等。

通常情况下,如果要向提交按钮添加参数,例如在表单上编辑特定子对象,则应该像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接