使用Grails SubmitToRemote onFailure选项不起作用

时间:2014-02-11 10:31:21

标签: javascript ajax grails gsp

我正在尝试使用Grails标记SubmitToRemote来处理失败消息(例如验证域对象上的错误)。

我的标签submitToRemote是:

<g:submitToRemote
      url="[action: 'save']"
      update="[success: 'wizard', failure: 'error']"
      onFailure="onFailure(data, code)"
      name="submit"
      class="btn btn-large btn-inverse"
      value="Save"/>

我的onFailure功能是:

   <g:javascript>
        function onFailure(data, code){
            document.getElementById('errors').style.display = 'inline';
            $('#errors').html(data);
        }

    </g:javascript>

最后,grails行动:

(...)
if(!plan.validate()){
    render status: 400, text: "This plan cannot be saved. Fill all fields and try again."
    return
}

我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:1)

我不知道这现在是否有帮助,但肯定可以帮助别人。

我已成功调用并将消息传递给 onFailure 方法。

所以我就是这样做的,我在控制器中设置了错误代码和文本,如下所示:

render(status: 403, text: 'Request failed to complete due to some error.')

然后在gsp上我使用 XMLHttpRequest 拉取了消息:

<g:formRemote onFailure="onFailure(XMLHttpRequest.responseText)" ...>

根据我的发现,我看到grails结束并在 onFailure 函数下创建ajax。

error:function(XMLHttpRequest,textStatus,errorThrown){onFailure(XMLHttpRequest.responseText)...
  

Grails版本:2.5.0

希望这有帮助!

答案 1 :(得分:0)

我使用onFailure但是在onSuccess上使用并实现了类似的功能。

<g:submitToRemote
      url="[action: 'save']"
      update="show_response"
      onSuccess="handleResponse(data, code)"
      name="submit"
      class="btn btn-large btn-inverse"
      value="Save"/>    

show_response是您希望显示响应(成功/失败)的div

控制器或服务中的

def save()  {
  //your data CRUD operation logic goes here
  // for success return success response
 return new Response("sucess")
  // for failure or error return error response
return new Response("error")

}

编写一个groovy类来处理响应,例如Response.groovy

class Response {  
        boolean success  
        def errors = []           

        Response(String errorMessage) {  
            this.success = false  
            this.errors << [message: errorMessage]  
        }  
        ....  
    } 

最后你的gsp代码看起来像

 <g:javascript>
    function handleResponse(response,textStatus){
    if(response.success === true){
     //use the div and write the UI to show message
     } else {
     //use the div and write the UI to show message
     }    
    </g:javascript>

可能需要进行细微更改才能使其正常工作,但我确信它符合您的需求