Grails: Ajax参数没有到达控制器

Grails: Ajax parameter is not reaching controller

本文关键字:控制器 Ajax 参数 Grails      更新时间:2023-09-26

我的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

所以我们可以看到,它不是空的,因为它打印值'35'在Chrome调试器,但为什么不是控制器看到这一点,特别是当它也被包含在由Ajax调用形成的URI ?

试着用这个替换你的$.ajax:

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

将'/'改为'?":

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

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

如果使用的是grails 2.x。X你也可以写:

def selectBatch (Integer batchID) {
    ...
}