自定义JsonResult解决Asp.net Mvc DateTime格式化问题

1 下载量 91 浏览量 更新于2024-08-29 收藏 63KB PDF 举报
"解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法" 在ASP.NET MVC框架中,当你使用`JsonResult`返回包含DateTime类型的JSON数据时,可能会遇到日期时间格式不友好的情况,比如默认转化为`Date(84923838332223)`这样的格式。这种格式在前端展示时并不直观,通常我们需要将其转换为更易于阅读的日期格式,如"yyyy-MM-dd HH:mm:ss"。 为了解决这个问题,我们可以选择在后端处理,而不是完全依赖前端来转换。一种有效的方法是创建一个自定义的`JsonResult`类,以便在序列化JSON时控制DateTime格式。让我们深入了解一下如何实现这个自定义`JsonResult`。 首先,我们需要了解`JsonResult`的基本结构。`JsonResult`继承自`ActionResult`,它的主要职责是将数据对象转换为JSON格式并写入响应流。源代码中,`ExecuteResult`方法是执行实际序列化并设置响应头的关键: ```csharp public override void ExecuteResult(ControllerContext context) { // ... HttpResponseBase response = context.HttpContext.Response; if (!string.IsNullOrEmpty(this.ContentType)) { response.ContentType = this.ContentType; } else { response.ContentType = "application/json"; } // 默认的JsonSerializerSettings可能没有处理DateTime格式 JavaScriptSerializer serializer = new JavaScriptSerializer(); // 在这里我们可以自定义序列化设置,比如添加DateTime格式化 serializer.RegisterConverters(new[] { new CustomDateTimeConverter() }); response.Write(serializer.Serialize(this.Data)); } ``` 在这个例子中,我们添加了一个名为`CustomDateTimeConverter`的自定义转换器,该转换器会覆盖默认的日期时间序列化行为。`CustomDateTimeConverter`需要实现`JavaScriptConverter`接口,并重写其`Serialize`、`Deserialize`方法,以确保DateTime对象按照期望的格式进行序列化。 ```csharp public class CustomDateTimeConverter : JavaScriptConverter { public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { if (type == typeof(DateTime)) { string dateStr = dictionary.First().Value.ToString(); return DateTime.Parse(dateStr); } return null; } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { if (obj is DateTime) { DateTime date = (DateTime)obj; // 将DateTime转换为我们期望的格式,例如"yyyy-MM-dd HH:mm:ss" return new Dictionary<string, object> { { "date", date.ToString("yyyy-MM-dd HH:mm:ss") } }; } return null; } public override IEnumerable<Type> SupportedTypes => new Type[] { typeof(DateTime) }; } ``` 这样,当你在控制器中返回一个自定义的`JsonResult`实例时,DateTime对象将会按照我们定义的格式“yyyy-MM-dd HH:mm:ss”进行序列化,从而解决了日期时间格式的问题。这种方法的优势在于,你可以在不干扰前端代码的情况下,确保JSON数据的正确格式,特别适用于与jQuery EasyUI或其他前端框架集成的场景。 总结起来,要解决ASP.NET MVC中DateTime类型在JSON序列化时的格式问题,你可以通过创建自定义的`JsonResult`类,利用`JavaScriptSerializer`的自定义转换器功能,将DateTime格式设置为你需要的格式。这样做不仅保持了后端逻辑的清晰,也避免了前端不必要的数据处理。