视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法
2020-11-27 22:37:06 责编:小采
文档


问题背景:

           在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符串是它默认转为Date(84923838332223)的格式,在经过查资料发现使用前端来解决这个问题的方法不少,但是我又发现在使用jquery easyui时,加载列表数据又不能对数据进行拦截,进行数据格式转换之后再加载,后来发现可以通过自定义JsonResult实现,认为这种方法比较可行,就开始研究

我们先来看看jsonResult的源码

public class JsonResult : ActionResult
 {
 public JsonResult()
 {
 this.JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.DenyGet;
 }
 
 public override void ExecuteResult(ControllerContext context)
 {
 if (context == null)
 {
 throw new ArgumentNullException("context");
 }
 if ((this.JsonRequestBehavior == System.Web.Mvc.JsonRequestBehavior.DenyGet) && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
 {
 throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
 }
 HttpResponseBase response = 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)
 {
 JavaScriptSerializer serializer = new JavaScriptSerializer();
 response.Write(serializer.Serialize(this.Data));
 }
 }
 
 public Encoding ContentEncoding { get; set; }
 
 public string ContentType { get; set; }
 
 public object Data { get; set; }
 
 public System.Web.Mvc.JsonRequestBehavior JsonRequestBehavior { get; set; }
 }
}

当我看到上面代码中的红色部分,我感到有些熟悉,心里比较高兴,以前使用过ashx来传json的都应该用过此方法吧

原来它也是使用这个方法进行序列化的。我们就可以在这个地方先获取到json序列化之后的字符串!然后做写“小动作”,就ok了

下面我就定义了一个自己的JsonResult了

/// <summary>
 /// 自定义Json视图
 /// </summary>
 public class CustomJsonResult:JsonResult
 {
 /// <summary>
 /// 格式化字符串
 /// </summary>
 public string FormateStr
 {
 get;
 set;
 }

 /// <summary>
 /// 重写执行视图
 /// </summary>
 /// <param name="context">上下文</param>
 public override void ExecuteResult(ControllerContext context)
 {
 if (context == null)
 {
 throw new ArgumentNullException("context");
 }

 HttpResponseBase response = 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)
 {
 JavaScriptSerializer jss = new JavaScriptSerializer();
 string jsonString = jss.Serialize(Data);
 string p = @"\\/Date\((\d+)\)\\/";
 MatchEvaluator matchEvaluator = new MatchEvaluator(this.ConvertJsonDateToDateString);
 Regex reg = new Regex(p);
 jsonString = reg.Replace(jsonString, matchEvaluator);

 response.Write(jsonString);
 }
 }

 /// <summary> 
 /// 将Json序列化的时间由/Date(1294499956278)转为字符串 .
 /// </summary> 
 /// <param name="m">正则匹配</param>
 /// <returns>格式化后的字符串</returns>
 private string ConvertJsonDateToDateString(Match m)
 {
 string result = string.Empty;
 DateTime dt = new DateTime(1970, 1, 1);
 dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
 dt = dt.ToLocalTime();
 result = dt.ToString(FormateStr);
 return result;
 }
 }


在这里做的“小动作”就是红色部分,得到字符串以后,通过正则表达式的方式获得Date(12347838383333)的字符串,然后把它转换为DateTime类型,最后在转为我们想要的格式即可,这个格式可以使用FormateStr属性设置。

剩下的就是使用我们自己定义的JsonResult来替换asp.net mvc默认的JsonResult的问题了,接着从源码中找答案,下面是Controller类的部分代码

protected internal JsonResult Json(object data)
 {
 return this.Json(data, null, null, JsonRequestBehavior.DenyGet);
 }
 
 protected internal JsonResult Json(object data, string contentType)
 {
 return this.Json(data, contentType, null, JsonRequestBehavior.DenyGet);
 }
 
 protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
 {
 return this.Json(data, null, null, behavior);
 }
 
 protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
 {
 return this.Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
 }
 
 protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
 {
 return this.Json(data, contentType, null, behavior);
 }
 
 protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
 {
 return new JsonResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior };
 }

以上是Controller类来实例化JsonResult的所有代码。我们只需写一个BaseController类,重写最后一个方法即可,然后我们自己的Controller在继承BaseController即可

下面是BaseController类的部分代码,我们为方便自己个性化的需要又定义了两个MyJosn的方法

/// <summary>
 /// 返回JsonResult
 /// </summary>
 /// <param name="data">数据</param>
 /// <param name="contentType">内容类型</param>
 /// <param name="contentEncoding">内容编码</param>
 /// <param name="behavior">行为</param>
 /// <returns>JsonReuslt</returns>
 protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
 {
 return new CustomJsonResult
 {
 Data = data,
 ContentType = contentType,
 ContentEncoding =contentEncoding,
 JsonRequestBehavior = behavior,
 FormateStr = "yyyy-MM-dd HH:mm:ss"
 };
 }

 /// <summary>
 /// 返回JsonResult.24 /// </summary>
 /// <param name="data">数据</param>
 /// <param name="behavior">行为</param>
 /// <param name="format">json中dateTime类型的格式</param>
 /// <returns>Json</returns>
 protected JsonResult MyJson(object data, JsonRequestBehavior behavior,string format)
 {
 return new CustomJsonResult
 {
 Data = data,
 JsonRequestBehavior = behavior,
 FormateStr = format
 };
 }

 /// <summary>
 /// 返回JsonResult42 /// </summary>
 /// <param name="data">数据</param>
 /// <param name="format">数据格式</param>
 /// <returns>Json</returns>
 protected JsonResult MyJson(object data, string format)
 {
 return new CustomJsonResult
 {
 Data = data,
 FormateStr = format
 };
 }

最后我们在自己的Controller中调用即可

public class ProjectMileStoneController : BaseController
 {
 /// <summary>
 /// 首页视图
 /// </summary>
 /// <returns>视图</returns>
 public ActionResult Index()
 {
 return this.View();
 }

 #region 项目里程碑查询

 /// <summary>
 /// 根据项目编号获取项目里程碑
 /// </summary>
 /// <param name="projectId">项目编号</param>
 /// <returns>项目里程碑</returns>
 public JsonResult GetProjectMileStoneByProjectId(int projectId)
 {
 IList<ProjectMileStone> projectMileStones = FacadeContainer.Get<IProjectMileStoneService>().GetProjectMileStonesByProjectId(projectId);
 return this.MyJson(projectMileStones, "yyyy.MM.dd");
 }

 #endregion
 }

原文地址:http://www.cnblogs.com/JerryWang1991

下载本文
显示全文
专题