jQuery ajax请求具有不同类型的响应来处理

时间:2014-10-03 09:43:49

标签: jquery html ajax json asp.net-mvc-4

我通过$.ajax()方法提交表单。我的要求是这样的:

       $.ajax(url, {
            type: "POST",
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            dataType: "html json",
            data: formData,
            headers: {
                "X-Requested-With": "XMLHttpRequest"
            }
        }).done(function (result) {
                //handle correct json response or html response
        }).fail(function (jqXHR, textStatus, errorThrown) {
            console.log(jqXHR);
            console.log(textStatus);
            console.log(errorThrown.stack);
        });

当服务器返回JSON响应时,所有响应都按预期进行。但是当响应为Html时,执行fail()回调(响应的状态代码为200 - OK)和errorThrown.stack作为此值:

"SyntaxError: Unexpected token <
    at Object.parse (native)
    at jQuery.extend.parseJSON (http://localhost/Scripts/jquery-1.10.2.js:550:23)
    at ajaxConvert (http://localhost/Scripts/jquery-1.10.2.js:8429:19)
    at done (http://localhost/Scripts/jquery-1.10.2.js:8185:15)
    at XMLHttpRequest.jQuery.ajaxTransport.send.callback (http://localhost/Scripts/jquery-1.10.2.js:8778:8)"

所以我认为它试图解析JSON而不是html。我不明白,因为我已将dataType选项设置为"html json" ...

以下是有关请求/响应的一些信息:

请求标题

Accept:text/html, */*; q=0.01
Accept-Encoding:gzip,deflate
Accept-Language:pt-PT,pt;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Content-Length:2386
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With:XMLHttpRequest

响应标题

Cache-Control:private, s-maxage=0
Content-Length:56392
Content-Type:text/html; charset=utf-8
Date:Fri, 03 Oct 2014 09:52:13 GMT
Server:Microsoft-IIS/8.5
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET

为什么会这样?

解决方案(基于@Oscar Bout回复)

        $.ajax(url, {
            type: "POST",
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            dataType: "html",
            data: formData,
            headers: {
                "X-Requested-With": "XMLHttpRequest"
            }
        }).done(function (result) {
            try {
                var jsonResult = $.parseJSON(result);
                //handle json result
            } catch (e) {
                $("#myDiv").html(result); //handle html result
            }
        }).fail(function (jqXHR, textStatus, errorThrown) {
            console.log(jqXHR);
            console.log(textStatus);
            console.log(errorThrown.stack);
        });

我认为使用try/catch不是最好的方法,所以我正在听其他选项。

1 个答案:

答案 0 :(得分:1)

您在dataType中所说的是“将html响应视为JSON”。

dateType函数中的2个值并不意味着它可以处理2种类型。 这意味着“将第一个视为第二个”。

所以这个错误很可悲。当html进来时,它被视为JSON。 解析那个并且很好......因为它不是JSON,但实际上HTML失败了。

该函数用于“语法正确json但带有html标题”。 您的回答可能是“语法正确html with html header”,因此“&lt;”在你的输出中。

也许对你来说,有一种方法可以使用 try {} catch(e){} 函数吗?

这里有dataType说明: http://api.jquery.com/jquery.ajax/