在MVC中,为什么返回Content
有时会在Ajax回调中失败,而返回Json会起作用,即使对于简单的字符串对象也是如此?
即使它失败了,如果您要在始终回调中访问它,数据仍然可用...
当我在ajax调用中将contentType设置为text/xml
时,响应将不再输入错误消息。
$.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
即使失败,数据仍然可用。
public ActionResult GetFooString()
{
String Foo = "This is my foo string.";
return Content(Foo);
} // end GetFooString
public ActionResult GetFooString()
{
String Foo = "This is my foo string.";
return Json(Foo, JsonRequestBehavior.AllowGet);
} // end GetFooString
答案 0 :(得分:16)
使用Content(Foo);
发送没有mime类型标头的响应。这是因为您在使用此重载时未设置ContentType
。如果未设置Content-Type,jQuery将尝试猜测内容类型。当发生这种情况时,它是否可以成功猜测取决于实际内容和底层浏览器。见here:
另一方面,dataType(默认值:Intelligent Guess(xml,json,script或html))
Json(...)
explicitly将内容类型设置为"application/json"
,以便jQuery确切地知道将内容视为什么。
如果您使用2nd overload并指定ContentType,则可以从Content
获得一致的结果:
return Content(Foo, "application/json"); // or "application/xml" if you're sending XML
但是如果你总是处理JSON,那么更喜欢使用JsonResult
return Json(Foo, JsonRequestBehavior.AllowGet);