使用时 jQuery阿贾克斯方法 提交表单数据,处理错误的最佳方法是什么?这是调用的示例:

$.ajax({
    url: "userCreation.ashx",
    data: { u:userName, p:password, e:email },
    type: "POST",
    beforeSend: function(){disableSubmitButton();},
    complete: function(){enableSubmitButton();},
    error: function(xhr, statusText, errorThrown){
            // Work out what the error was and display the appropriate message
        },
    success: function(data){
            displayUserCreatedMessage();
            refreshUserList();
        }
});

请求可能会因多种原因而失败,例如重复的用户名、重复的电子邮件地址等,并且 ashx 被编写为在发生这种情况时抛出异常。

我的问题似乎是通过抛出异常 ashx 导致 statusTexterrorThrown 成为 不明确的.

我可以到达 XMLHttpRequest.responseText 其中包含构成标准 .net 错误页面的 HTML。

我在responseText 中找到页面标题,并使用该标题来找出引发了哪个错误。尽管我怀疑当我启用自定义错误处理页面时这会崩溃。

我应该在 ashx 中抛出错误,还是应该返回状态代码作为调用返回的数据的一部分 userCreation.ashx, ,然后用它来决定采取什么行动?
你如何处理这些情况?

有帮助吗?

解决方案

我应该在ASHX中丢弃错误,还是应该返回状态代码作为呼叫返回到UserCreation.ASHX的数据的一部分,然后使用它来决定要采取什么措施?您如何处理这些情况?

就我个人而言,如果可能的话,我更愿意在服务器端处理这个问题,并在那里向用户发送消息。在您只想向用户显示一条消息,告诉他们发生了什么(本质上是验证消息)的情况下,这非常有效。

但是,如果您想根据服务器上发生的情况执行操作,您可能需要使用状态代码并编写一些 JavaScript 来根据该状态代码执行各种操作。

其他提示

为了调试,我通常只创建一个元素(在下面的情况下: <div id="error"></div>)在页面上并向其写入 XmlHttpRequest:

error: function (XMLHttpRequest, textStatus, errorThrown) {
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText);
}

然后您可以看到正在发生的错误类型并正确捕获它们:

if (XMLHttpRequest.status === 404) // display some page not found error
if (XMLHttpRequest.status === 500) // display some server error

在你的 ashx 中,你可以抛出一个新的异常(例如“无效用户”等),然后从 XMLHttpRequest.responseText?对我来说,当我遇到错误时 XMLHttpRequest.responseText 不是标准的 Asp.Net 错误页面,它是一个包含如下错误的 JSON 对象:

{
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n
Parameter name: index",
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...",
"ExceptionType":"System.ArgumentOutOfRangeException"
}

编辑:这可能是因为我调用的函数标记有以下属性:

<WebMethod()> _
<ScriptMethod()> _

现在我有一个问题,不知道该接受哪个答案。

对这个问题的进一步思考使我得出的结论是我错误地抛出了异常。重复的用户名、电子邮件地址等是注册过程中的预期问题,因此不是例外,而只是错误。在这种情况下,我可能不应该抛出异常,而是返回错误代码。

这让我想到 罗宾森的 在这种情况下应该采取这种方法,特别是因为表单只是所显示的 UI 的一小部分。我现在已经实现了这个解决方案,并且返回包含状态和要显示的可选消息的 xml。然后我可以使用 jQuery 解析它并采取适当的操作:-

success: function(data){
    var created = $("result", data).attr("success");
    if (created == "OK"){
        resetNewUserForm();
        listUsers('');
    } else {
        var errorMessage = $("result", data).attr("message");
        $("#newUserErrorMessage").text(errorMessage).show();
    }
    enableNewUserForm();
}

然而 特拉维斯的 答案非常详细,在调试期间或者如果我想向用户显示异常消息,这将是完美的。我肯定没有收到 JSON 返回,所以这可能是由于 travis 列出的属性之一,因为我的代码中没有它们。

(我将接受罗宾森的回答,但支持特拉维斯的回答。接受一个没有获得最多票数的答案只是感觉很奇怪。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top