【问题标题】:Grails: Ajax parameter is not reaching controllerGrails:Ajax 参数未到达控制器
【发布时间】:2014-06-10 20:42:34
【问题描述】:

我的 GSP 中有一个按钮,如下所示:

<button id = "select"
    onclick = "${remoteFunction(controller: 'customer', 
                                action: 'selectBatch',
                                params: '\'batchID=\' + selectedBatchID')}">
Select
</button>

一切都很好,“batchID”参数可以很好地到达我的控制器,但我意识到我不想在每次单击按钮时调用此函数,只有在满足某些条件时。所以,我像这样重新定义了我的按钮:

<button id = "select" >Select</button>

并将其绑定到这样的 javascript 函数:

$('#select').click(function () {
    if (selectedBatchID == undefined) {
        $("#errorMessages p").text("Click a row to choose a batch first.");
        $("#errorMessages p").show();
        $("#errorMessages p").fadeOut(3000);
    }
    else {
        validBatchID = selectedBatchID;
        $("#choosebatch h2").text("Batch ID " + selectedBatchID + ": " + selectedBatchDesc);
        $('#AdminConsole p').css("font-size", "30px");
        $("#AdminConsole p").html("Batch ID " + selectedBatchID + "<br />" + selectedBatchDesc);
        console.log(selectedBatchID);
        $.ajax({
               type: 'POST',
               url: "${createLink(action:'selectBatch', controller:'customer')}/batchID=" + selectedBatchID
        });
    } 
});

现在看来这个变量没有达到我控制器的功能,就像这样:

def selectBatch = {
    println "Batch ID: " + params.batchID
    selectedBatch = Batch.findWhere(id: params.batchID.toInteger())
    println "Batch selected: " + selectedBatch
}

因为我的控制器抱怨:

............Batch ID: null
Error |
2014-06-10 16:27:54,686 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver  -         NullPointerException occurred when processing request: [POST] /FatcaOne_0/customer/selectBatch    /batchID=35
Cannot invoke method toInteger() on null object. Stacktrace follows:
Message: Cannot invoke method toInteger() on null object

这就是 Chrome 调试器显示的内容:

35 VM725:78
POST http://hostname/FatcaOne_0/customer/selectBatch/batchID=35 500 (Internal Server     Error) jquery.tools.min.js:38
send jquery.tools.min.js:38
f.extend.ajax jquery.tools.min.js:38
(anonymous function) VM725:79
f.event.dispatch jquery.tools.min.js:37
h.handle.i

所以我们可以看到它不为空,因为它在 Chrome 调试器中打印值 '35' 但是为什么控制器没有看到这一点,尤其是当它也包含在由 Ajax 形成的 URI 中时打电话?

【问题讨论】:

    标签: javascript jquery ajax grails


    【解决方案1】:

    尝试用这个替换你的$.ajax

    $.ajax({
        url: "${createLink(controller: 'customer', action: 'selectBatch')}",
        type: 'POST',
        data: {batchID: selectedBatchID}
    });      
    

    【讨论】:

    • 这行得通。如果您愿意解释一下为什么会这样,我将不胜感激。非常感谢您的帮助。
    • @AnonymousHuman 发送 HTTP POST 请求时,您不会将请求参数附加到 URL,而是在请求正文中传递。使用$.ajax 时的方法是将它们作为data 属性的值传递
    【解决方案2】:

    把'/'改成'?':

    ${createLink(action:'selectBatch', controller:'customer')}/batchID=
    

    ${createLink(action:'selectBatch', controller:'customer')}?batchID=
    

    如果您正在使用 grails 2.x.x,您还可以编写:

    def selectBatch (Integer batchID) {
        ...
    }
    

    【讨论】:

    • 我试过这个但得到了相同的结果。谢谢你的建议。我确实看到这可能是另一种方法,但我对 Grails 还太陌生,无法理解 '/' 和 '?' 之间的区别
    • 添加 println 参数来看看你有什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2015-12-03
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2021-06-23
    相关资源
    最近更新 更多