MVC控制器返回内容与返回Json Ajax

sil*_*age 10 c# ajax asp.net-mvc jquery json

在MVC中,为什么返回Content有时会在Ajax回调中失败,而返回Json会起作用,即使对于简单的字符串对象也是如此?

即使它失败了,如果您要在始终回调中访问它,数据仍然可用...

更新:

当我在ajax调用中设置contentType时,text/xml响应将不再输入错误消息.

AJAX:

$.ajax({
    cache: false,
    type: "GET",
    contentType: "application/json; charset=utf-8",
    dataType: 'json',
    url: "/MyController/GetFooString",
    data: { },
    success: function (data) {
        alert(data);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert("Ajax Failed!!!");
    }
}); // end ajax call
Run Code Online (Sandbox Code Playgroud)

失败的控制器操作(有时)

即使失败,数据仍然可用.

public ActionResult GetFooString()
{
    String Foo = "This is my foo string.";
    return Content(Foo);
} // end GetFooString
Run Code Online (Sandbox Code Playgroud)

始终有效的控制器操作

public ActionResult GetFooString()
{
    String Foo = "This is my foo string.";
    return Json(Foo, JsonRequestBehavior.AllowGet);
} // end GetFooString
Run Code Online (Sandbox Code Playgroud)

Mrc*_*ief 16

使用Content(Foo);发送没有mime类型标头的响应.发生这种情况是因为您ContentType在使用此过载时未设置.如果未设置Content-Type,jQuery将尝试猜测内容类型.当发生这种情况时,它是否可以成功猜测取决于实际内容和底层浏览器.看到这里:

dataType(默认值:Intelligent Guess(xml,json,script或html))

Json(...)另一方面,显式设置内容类型,"application/json"以便jQuery确切地知道将内容视为什么.

Content如果使用第二个重载并指定ContentType ,则可以得到一致的结果:

return Content(Foo, "application/json"); // or "application/xml" if you're sending XML
Run Code Online (Sandbox Code Playgroud)

但是如果你总是处理JSON,那么更喜欢使用 JsonResult

return Json(Foo, JsonRequestBehavior.AllowGet); 
Run Code Online (Sandbox Code Playgroud)