该问题是由从jQuery 1.8升级到1.9引起的。在jQuery 1.7和1.8中,在MVC中是这样的:
return Json(null);
被接受为有效JSON,并被解释为null。从技术上讲,这将使用HTTP 200将空白字符串发送回客户端,对于jQuery <1.9来说已经足够了。
但是现在(我们使用的是jQuery
1.9.1),它尝试将空字符串解析为JSON,jQuery的JSON解析器在空字符串上引发异常,并触发一条以
fail()回调结束的代码链。
解决方法是在成功的情况下将此消息从服务器传回,而没有其他信息:
return Json(new{});这通过jQuery的JSON解析器进行了汇总,一切都很好。这也适用:
return Json(true);
更新资料
Musa指出,MVC的这种行为似乎已损坏。这种[独立的堆栈溢出的答案 _使用JSON.NET在ASP.NET MVC 3默认JSON序列化-这可能吗?
涵盖如何使MVC返回null的方法
Json(null)-基本上,使用Json.NET而不是ASP.NET
MVC的内置JSON序列化程序。这是我最终使用的解决方案。
您需要使用对该答案的稍作修改的版本才能解决此问题-代码如下。基本上,不要
if在传递序列化之前包括检查null 的语句,否则您将陷入同样的困境。
更新2
Json.NET中ISO 8601日期的默认实现在尝试使用进行解析时会中断Internet Explorer
9及更低版本
newDate(...)。换句话说,这些解析在Internet Explorer 9中很好:
var date = new Date('2014-09-18T17:21:57.669');var date = new Date('2014-09-18T17:21:57.600');但这会引发异常:
var date = new Date('2014-09-18T17:21:57.6');Internet Explorer
9的Date()实现只能处理3毫秒的地方,无法解决任何其他问题。要解决此问题,您必须重写Json.NET日期格式以强制使用它。包含在下面的代码中。
public class JsonNetResult : JsonResult{ public override void ExecuteResult(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); var response = context.HttpContext.Response; response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) response.ContentEncoding = ContentEncoding; var settings = new JsonSerializerSettings { Converters = new[] {new IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK" }} }; var jsonSerializer = JsonSerializer.Create(settings); jsonSerializer.Serialize(response.Output, Data); }}演示如何将其绑定到baseController的要点:
https://gist.github.com/b9chris/6991b341e89bb0a4e6d801d02dfd7730



