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

Posted

技术标签:

【中文标题】MVC 控制器返回内容与返回 Json Ajax【英文标题】:MVC Controller Return Content vs Return Json Ajax 【发布时间】:2014-11-16 22:03:43 【问题描述】:

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

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

更新:

当我将 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

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

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

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

【问题讨论】:

定义“失败”。服务器返回的实际响应是什么?它与“成功”响应有何不同? 在Ajax方法中进入错误函数,即使数据返回正确,也没有任何错误。成功响应在 Ajax Success 方法中触发,我在其中提醒数据。 尝试将 contentType: "application/json", 添加到您的参数列表中。 @silencedmessage:为了让处理程序有任何差异,关于响应的something 必须不同。它的内容、标题等等。 @David 如果我在 Ajax 调用中将内容类型更改为 text/xml,则返回内容不会失败。一位同事有一个理论,即 Content 返回一个被翻译为纯文本的字符串对象,而返回 json 显式返回一个 json 对象。 【参考方案1】:

使用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); 

【讨论】:

+1。但是,如果 OP 总是期望 JSON,那么将 ActionResult 更改为 JsonResult 会不会更好? @MelanciaUK:如果人们总是期待 JSON,那么可以。但我明白你的意思。更新我的答案... 感谢您的澄清。我很怀疑。 this 的情况下,我总是期待 JSON,但我真正缺少的部分是 mime 类型以及 ContentResultJsonResult 之间的差异。

以上是关于MVC 控制器返回内容与返回 Json Ajax的主要内容,如果未能解决你的问题,请参考以下文章

AJAX MVC server返回Json数据,client获取Json数据

Spring MVC 中 AJAX请求并返回JSON

从控制器返回后没有调用 Ajax Success 函数? MVC

Jquery Ajax,从 mvc.net 控制器返回成功/错误

从 php 中的 mvc 控制器方法返回一个 json 值

将 json 与 jquery Ajax 一起使用不会返回任何内容