解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法
问题背景:
在使用asp.netmvc结合jqueryesayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符串是它默认转为Date(84923838332223)的格式,在经过查资料发现使用前端来解决这个问题的方法不少,但是我又发现在使用jqueryeasyui时,加载列表数据又不能对数据进行拦截,进行数据格式转换之后再加载,后来发现可以通过自定义JsonResult实现,认为这种方法比较可行,就开始研究
我们先来看看jsonResult的源码
publicclassJsonResult:ActionResult { publicJsonResult() { this.JsonRequestBehavior=System.Web.Mvc.JsonRequestBehavior.DenyGet; } publicoverridevoidExecuteResult(ControllerContextcontext) { if(context==null) { thrownewArgumentNullException("context"); } if((this.JsonRequestBehavior==System.Web.Mvc.JsonRequestBehavior.DenyGet)&&string.Equals(context.HttpContext.Request.HttpMethod,"GET",StringComparison.OrdinalIgnoreCase)) { thrownewInvalidOperationException(MvcResources.JsonRequest_GetNotAllowed); } HttpResponseBaseresponse=context.HttpContext.Response; if(!string.IsNullOrEmpty(this.ContentType)) { response.ContentType=this.ContentType; } else { response.ContentType="application/json"; } if(this.ContentEncoding!=null) { response.ContentEncoding=this.ContentEncoding; } if(this.Data!=null) { JavaScriptSerializerserializer=newJavaScriptSerializer(); response.Write(serializer.Serialize(this.Data)); } } publicEncodingContentEncoding{get;set;} publicstringContentType{get;set;} publicobjectData{get;set;} publicSystem.Web.Mvc.JsonRequestBehaviorJsonRequestBehavior{get;set;} } }
当我看到上面代码中的红色部分,我感到有些熟悉,心里比较高兴,以前使用过ashx来传json的都应该用过此方法吧
原来它也是使用这个方法进行序列化的。我们就可以在这个地方先获取到json序列化之后的字符串!然后做写“小动作”,就ok了
下面我就定义了一个自己的JsonResult了
///<summary> ///自定义Json视图 ///</summary> publicclassCustomJsonResult:JsonResult { ///<summary> ///格式化字符串 ///</summary> publicstringFormateStr { get; set; } ///<summary> ///重写执行视图 ///</summary> ///<paramname="context">上下文</param> publicoverridevoidExecuteResult(ControllerContextcontext) { if(context==null) { thrownewArgumentNullException("context"); } HttpResponseBaseresponse=context.HttpContext.Response; if(string.IsNullOrEmpty(this.ContentType)) { response.ContentType=this.ContentType; } else { response.ContentType="application/json"; } if(this.ContentEncoding!=null) { response.ContentEncoding=this.ContentEncoding; } if(this.Data!=null) { JavaScriptSerializerjss=newJavaScriptSerializer(); stringjsonString=jss.Serialize(Data); stringp=@"\\/Date\((\d+)\)\\/"; MatchEvaluatormatchEvaluator=newMatchEvaluator(this.ConvertJsonDateToDateString); Regexreg=newRegex(p); jsonString=reg.Replace(jsonString,matchEvaluator); response.Write(jsonString); } } ///<summary> ///将Json序列化的时间由/Date(1294499956278)转为字符串. ///</summary> ///<paramname="m">正则匹配</param> ///<returns>格式化后的字符串</returns> privatestringConvertJsonDateToDateString(Matchm) { stringresult=string.Empty; DateTimedt=newDateTime(1970,1,1); dt=dt.AddMilliseconds(long.Parse(m.Groups[1].Value)); dt=dt.ToLocalTime(); result=dt.ToString(FormateStr); returnresult; } }
在这里做的“小动作”就是红色部分,得到字符串以后,通过正则表达式的方式获得Date(12347838383333)的字符串,然后把它转换为DateTime类型,最后在转为我们想要的格式即可,这个格式可以使用FormateStr属性设置。
剩下的就是使用我们自己定义的JsonResult来替换asp.netmvc默认的JsonResult的问题了,接着从源码中找答案,下面是Controller类的部分代码
protectedinternalJsonResultJson(objectdata) { returnthis.Json(data,null,null,JsonRequestBehavior.DenyGet); } protectedinternalJsonResultJson(objectdata,stringcontentType) { returnthis.Json(data,contentType,null,JsonRequestBehavior.DenyGet); } protectedinternalJsonResultJson(objectdata,JsonRequestBehaviorbehavior) { returnthis.Json(data,null,null,behavior); } protectedinternalvirtualJsonResultJson(objectdata,stringcontentType,EncodingcontentEncoding) { returnthis.Json(data,contentType,contentEncoding,JsonRequestBehavior.DenyGet); } protectedinternalJsonResultJson(objectdata,stringcontentType,JsonRequestBehaviorbehavior) { returnthis.Json(data,contentType,null,behavior); } protectedinternalvirtualJsonResultJson(objectdata,stringcontentType,EncodingcontentEncoding,JsonRequestBehaviorbehavior) { returnnewJsonResult{Data=data,ContentType=contentType,ContentEncoding=contentEncoding,JsonRequestBehavior=behavior}; }
以上是Controller类来实例化JsonResult的所有代码。我们只需写一个BaseController类,重写最后一个方法即可,然后我们自己的Controller在继承BaseController即可
下面是BaseController类的部分代码,我们为方便自己个性化的需要又定义了两个MyJosn的方法
///<summary> ///返回JsonResult ///</summary> ///<paramname="data">数据</param> ///<paramname="contentType">内容类型</param> ///<paramname="contentEncoding">内容编码</param> ///<paramname="behavior">行为</param> ///<returns>JsonReuslt</returns> protectedoverrideJsonResultJson(objectdata,stringcontentType,System.Text.EncodingcontentEncoding,JsonRequestBehaviorbehavior) { returnnewCustomJsonResult { Data=data, ContentType=contentType, ContentEncoding=contentEncoding, JsonRequestBehavior=behavior, FormateStr="yyyy-MM-ddHH:mm:ss" }; } ///<summary> ///返回JsonResult.24///</summary> ///<paramname="data">数据</param> ///<paramname="behavior">行为</param> ///<paramname="format">json中dateTime类型的格式</param> ///<returns>Json</returns> protectedJsonResultMyJson(objectdata,JsonRequestBehaviorbehavior,stringformat) { returnnewCustomJsonResult { Data=data, JsonRequestBehavior=behavior, FormateStr=format }; } ///<summary> ///返回JsonResult42///</summary> ///<paramname="data">数据</param> ///<paramname="format">数据格式</param> ///<returns>Json</returns> protectedJsonResultMyJson(objectdata,stringformat) { returnnewCustomJsonResult { Data=data, FormateStr=format }; }
最后我们在自己的Controller中调用即可
publicclassProjectMileStoneController:BaseController { ///<summary> ///首页视图 ///</summary> ///<returns>视图</returns> publicActionResultIndex() { returnthis.View(); } #region项目里程碑查询 ///<summary> ///根据项目编号获取项目里程碑 ///</summary> ///<paramname="projectId">项目编号</param> ///<returns>项目里程碑</returns> publicJsonResultGetProjectMileStoneByProjectId(intprojectId) { IList<ProjectMileStone>projectMileStones=FacadeContainer.Get<IProjectMileStoneService>().GetProjectMileStonesByProjectId(projectId); returnthis.MyJson(projectMileStones,"yyyy.MM.dd"); } #endregion }
原文地址:http://www.cnblogs.com/JerryWang1991
以上就是Asp.netMvc返回JsonResult中DateTime类型数据格式问题的解决方法,希望对大家的学习有所帮助。