3

如果我发出常规请求,我可以在 UrlMappings.groovy 中定义对错误和异常的处理,如下例所示:

    "403"(controller: 'error', action: 'index', params:['code':'403'])
    "404"(controller: 'error', action: 'index', params:['code':'404'])
    "500"(controller: 'error', action: 'index', params:['code':'500'])
    "500"(controller: 'home', action: 'noPrivileges', exception: IllegalOperationException)

然后我可以处理特定控制器中的错误并呈现我选择的视图,例如

class ErrorController {

    def index = {
        render view: "/errors/myErrorPage", model: [code: params.code]
    }
}

这完美地工作,每当服务器上出现错误时,我都会得到我的错误页面。

现在我怎样才能为 ajax 请求实现相同的行为?我正在使用 grails remoteFunctionformRemote发出 ajax 请求。每当服务器上发生异常时,我想在 javascript 中执行相同的代码(例如,我想用 alert('There was an exception') 显示警报)。

上述方法不适用于 ajax 请求。我仍然返回一个错误,即使错误中有 myErrorPage.gsp 的内容,它也不会打印到我使用 formRemote 或 remoteFunction 的更新参数指定的 html 元素中。

4

3 回答 3

6

我终于找到了一个与用于处理标准请求的方法兼容的完全干净的解决方案。

您需要修改处理错误的操作,如下例所示:

class ErrorController {

    def index = {
        if (request.xhr) {
             response.status = 200
             render template: "/errors/myAjaxErrorTemplate", model: [code: params.code]
        } else {
             render view: "/errors/myErrorPage", model: [code: params.code]
        }
    }
}

使用 request.xhr,您可以区分 ajax 请求和标准请求。在 ajax 请求中,您还需要通过将响应状态设置为 200 来告诉 grails 响应正常。

非常漂亮和干净。:) 我很惊讶这不能在任何地方用谷歌搜索......

于 2012-08-31T13:59:18.263 回答
1

remoteFunction触发几个事件onFailureon_ERROR_CODE. 您可以使用该事件来显示警告消息。

您可以在文档中查看更多详细信息

于 2012-08-31T12:44:11.850 回答
0

如果请求状态设置正确,您可以通过/的onFailure属性定义 JavaScript 函数。remoteFunctionformRemote

在此函数中,您可以在客户端处理您的异常。

使用文档中的示例,它可能如下所示:

<select onchange="${remoteFunction(action: 'bookByName',
                       update: [success: 'great', failure: 'ohno'],
                       params: '\'bookName=\' + this.value'),
                       onFailure: 'handleError'}">
    <option>first</option>
    <option>second</option>
</select>
于 2012-08-31T12:41:49.340 回答