zoukankan      html  css  js  c++  java
  • 使用Newtonsoft.json 解决 Asp.Net MVC DateTime类型数据Json格式化问题

    解决思路

    众所周知,MVC中调用的微软的组件JavaScriptSerialer...,格式DateTime类型数据需要在客户端专门解。

    还知道,NewtonSoft.json可以“正确”的格式化DateTime类型的数据。

    但是,如果在MVC中使用NewtonSoft.json的话,则需要调用Controller.Content(),返回的为字符串,客户端还要做转换。

    而,Action返回的结果都是JsonResult。

    于是,我用NewtonSoft.json的方法封装了一个NewtonJsonReuslt的类型,供Controller调用,具体的参考的MVC JsonResult的源码,没有技术含量。

    代码部分

    using System.Web.Mvc;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
    
    namespace System.Web.Mvc
    {
        public class NewtonJsonResult : JsonResult
        {
            public JsonSerializerSettings JsonSerializerSettings { get; set; }
            public NewtonJsonResult()
            {
                this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
            }
            public NewtonJsonResult(object obj)
            {
                this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
                this.Data = obj;
            }
            public NewtonJsonResult(object obj,JsonSerializerSettings jsonSerializerSettings)
            {
                this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
                this.Data = obj;
                this.JsonSerializerSettings = jsonSerializerSettings;
            }
    
            public override void ExecuteResult(ControllerContext context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("context");
                }
                if ((this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) && (string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)))
                {
                    throw new InvalidOperationException("改方法当前不允许使用Get");
                }
                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)
                {
                    string strJson = JsonConvert.SerializeObject(this.Data, JsonSerializerSettings);
                    response.Write(strJson);
                    response.End();
                }
            }
        }
    }
    查看代码

    调用demo:

     public ActionResult Get(int pageIndex)
            {
                IArticleService service = new ArticleService();
                int allPageCount;
                List<Model.Article> list = service.GetArticleByPage(PAGESIZE, pageIndex, out allPageCount);
                return new NewtonJsonResult(list, new JsonSerializerSettings() { DateFormatString="yyyy年MM月dd日 HH:mm:ss" });
            }
    查看代码

    上面代码随手写的,有错误,望大家勿喷...

    另外,还写了静态的ControllBase扩展方法

    using System.Text;
    using System.Web.Mvc;
    
    namespace System.Web.Mvc
    {
        public static class ControllerExtend
        {
            public static ActionResult NewtonJson(this ControllerBase controller, object obj)
            {
                return NewtonJson(controller, null, null, JsonRequestBehavior.DenyGet, obj);
            }
            public static ActionResult NewtonJson(this ControllerBase controller, Encoding encoding, string contentType, JsonRequestBehavior jsonRequestBehavior, object obj)
            {
                return new NewtonJsonResult() { ContentEncoding = encoding, ContentType = contentType, JsonRequestBehavior = jsonRequestBehavior, Data = obj };
            }
            public static ActionResult NewtonJson(this ControllerBase controller, object obj, JsonRequestBehavior jsonRequestBehavior)
            {
                return NewtonJson(controller, null, null, jsonRequestBehavior, obj);
            }
            public static ActionResult NewtonJson(this ControllerBase controller, object obj, Encoding encoding, JsonRequestBehavior jsonRequestBehavior)
            {
                return NewtonJson(controller, encoding, null, jsonRequestBehavior, obj);
            }
            public static ActionResult NewtonJson(this ControllerBase controller, object obj, string contentType)
            {
                return NewtonJson(controller, null, contentType, JsonRequestBehavior.DenyGet, obj);
            }
            public static ActionResult NewtonJson(this ControllerBase controller, object obj, Encoding encoding)
            {
                return NewtonJson(controller, encoding, null, JsonRequestBehavior.DenyGet, obj);
            }
            public static ActionResult NewtonJson(this ControllerBase controller, object obj, Encoding encoding, string contentType)
            {
                return NewtonJson(controller, encoding, contentType, JsonRequestBehavior.DenyGet, obj);
            }
            public static ActionResult NewtonJson(this ControllerBase controller, object obj, Encoding encoding, string contentType, JsonRequestBehavior jsonRequestBehavior)
            {
                return NewtonJson(controller, encoding, contentType, jsonRequestBehavior, obj);
            }
        }
    }
    查看代码

    不过,调用的时候有点小问题,看下面的最后两个return语句,不太明白为什么扩展方法必须要写一个对象去调用?难道是扩展方法中的第一个参数导致的必须写?还望路过的大侠给小弟解惑,小弟不胜感激...

    1 public ActionResult Get(int pageIndex)
    2         {
    3             IArticleService service = new ArticleService();
    4             int allPageCount;
    5             List<Model.Article> list = service.GetArticleByPage(PAGESIZE, pageIndex, out allPageCount);
    6             return new NewtonJsonResult(list, new JsonSerializerSettings() { DateFormatString="yyyy年MM月dd日 HH:mm:ss" });
    7             return NewtonJson(list);//这样是直接报错的,找不到方法,必须按照下面的写法才行..
    8             return this.NewtonJson(list);
    9         }
    View Code
  • 相关阅读:
    3. 技术专题
    3. 技术专题
    1. 个人经验总结
    2. 阿里巴巴Java开发手册主题
    自动化构建工具演化、对比、总结
    2. 阿里巴巴Java开发手册主题
    (转)高并发高流量的大型网站架构设计(二)
    (转)高并发高流量的大型网站架构设计(一)
    (转)可伸缩性最佳实践:来自eBay的经验
    (转)Application, Session, Cookie, Viewstate, Cache对象用法和区别
  • 原文地址:https://www.cnblogs.com/flytigger/p/3199733.html
Copyright © 2011-2022 走看看