从ASP.NET MVC返回null时,jQuery post JSON失败
|
我使用 ASP.NET MVC从jQuery发布JSON,并获得一些JSON,使用这个小库函数: (function($) {
$.postJson = function(url,data) {
return $.ajax({
url: url,data: JSON.stringify(data),type: 'POST',dataType: 'json',contentType: 'application/json; charset=utf-8'
});
};
})(jQuery);
很明显我会称之为: $('#button').click(function() {
$.postJson('/controller/action',{ Prop1: 'hi',Prop2: 'bye' })
.done(function(r) { alert('It worked.'); })
.fail(function(x) { alert('Fail! ' + x.status); });
});
ASP.NET MVC 3和ASP.NET MVC 4支持事物的提交方面(之前您需要扩展ASP.NET MVC来处理提交JSON),但我遇到的问题是返回.在控制器上,我经常返回null,基本上说“成功,没有别的可以说”,就像: [HttpPost]
public JsonResult DoSomething(string Prop1,string Prop2)
{
if (doSomething(Prop1,Prop2)
return Json(null); // Success
return Json(new { Message = "It didn't work for the following reasons" });
}
我经常使用这种模式,它工作正常 – 我的成功/完成回调被调用,一切都很好.但是最近我升级了ASP.NET MVC和jQuery,并且它停止工作 – 相反,当我返回Json(null);我的失败回调函数被调用.此外,我检查了响应,并且返回的statusCode实际上是200,所以服务器不会失败 – jQuery只是说. 解决方法问题是由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); 更新 这个MVC下面的Musa笔记看起来已经坏了.这个separate Stack Overflow answer to Using JSON.NET as the default JSON serializer in ASP.NET MVC 3 – is it possible?涵盖了如何让MVC为Json(null)返回null – 基本上,使用Json.NET而不是ASP.NET MVC的内置JSON序列化程序.这是我最终使用的解决方案. 您需要使用稍微修改版本的答案来解决这个问题 – 代码如下.基本上,在传递到序列化之前,不要包含if语句检查null,或者你回到同样的困境. 更新2 Joss.NET中的ISO 8601日期的默认实现在尝试使用新的Date(…)解析时断开InternetExplorer9及更低版本.换句话说,这些解析在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()实现无法处理任何东西,只有三毫秒的地方.要解决这个问题,你必须重写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);
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 调用en外部javascript文件的函数
- asp.net – web.config转换未在VS2010中显示
- asp.net-mvc – 可以将NUnit集成到Visual Studio 2010中吗?
- asp.net-mvc – 针对SAAS的多租户客户端特定定制
- ASP.NET Web部署项目:摆脱.compiled文件
- iis – “立即启动应用程序池”和“启动模式AlwaysRunning”
- asp.net-mvc-3 – 如何修改MVC3视图页面中的body类
- asp.net-mvc – “挑战”一词代表什么?
- ASP.NET – 在屏幕底部显示应用程序生成日期/信息
- asp.net – 当用户未通过身份验证时如何处理ajax请求?
- ASP.NET Core 1.0 F#项目
- asp.net-mvc – 允许Anonymous在asp.net mvc 3中
- asp.net-mvc – ASP.NET MVC获取具有特定配置文件
- asp.net-mvc – ASP.NET MVC – 接口类型上的自定
- asp.net-mvc – 如何从剃刀视图访问My.Resources
- asp.net – MVC 3在IEnumerable模型视图中编辑数
- asp.net – 单个应用程序中的多个母版页
- asp.net-mvc – ASP.Net MVC如何使用Html.Render
- asp.net – Dotnetopenauth oAuth服务提供商的解
- asp.net-mvc – ASP.NET MVC会话超时,绝对还是滑
