欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

asp.net MVC 5 及 Web API修改日期格式

程序员文章站 2022-06-11 10:12:57
...

在Asp.net MVC 5 (目前我用的是5这个版本) 中. Web API 和MVC 是两个独立的体系.

很多时候为了解决一个问题查来查去, 方案很多就是不管用. 后来才恍然大悟. 原来是两个体系… 只不过可以在同一个网站下运行.

Web API中是可以直接return obj对象的, 不需要return Json(obj) 这样的数据,

而MVC中需要返回不同的ActionResult.

所以Web API中是不需要 return Json(obj); 这么写的.
而在MVC中则需要 return Json(obj);

Web API 返回了是给系统用的, 有的系统希望返回的是json, 有的系统希望返回的是xml
那么在Web API中默认天生就支持可以返回成不同的数据格式.
只需要如下配置,(建议将Web API相关的配置都放在WebApiConfig这个文件中)
//请求参数中带json=true就可以返回json格式的数据,代码中只需要返回一个对象即可
// 请求参数中带datatype=xml就可以返回xml格式的数据,代码中只需要返回一个对象即可

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
       
            //跨域配置
            //config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

            // Web API 路由
            //config.MapHttpAttributeRoutes(); 

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Filters.Add(new ApiExceptionFilter());

            // Remove the JSON formatter
            // 删除JSON格式化器
            //config.Formatters.Remove(config.Formatters.JsonFormatter); //这个移除了,就不能输出json了
            //config.Formatters.Remove(config.Formatters.XmlFormatter);  //这个移除了,就不能输出xml了
            
             //请求参数中带json=true就可以返回json格式的数据,代码中只需要返回一个对象即可
            config.Formatters.JsonFormatter.MediaTypeMappings.Add(new System.Net.Http.Formatting.QueryStringMapping("json", "true", "application/json"));
            //请求参数中带datatype=xml就可以返回xml格式的数据,代码中只需要返回一个对象即可
            config.Formatters.XmlFormatter.MediaTypeMappings.Add(new System.Net.Http.Formatting.QueryStringMapping("datatype", "xml", "application/xml"));


            config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;//本地时区,没有了8小时的问题
            config.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd hh:mm:ss";//日期格式
            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.IsoDateTimeConverter{DateTimeFormat = "yyyy-MM-dd HH:mm:ss"});
            //为了书写有缩进的JSON,可以将Formatting设置为Formatting.Indented:
            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;

            //驼峰式大小写转换
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();


        }
         
    }

重点是.什么呢. 以上所有的方法都只能在 Web API中生效. 跟MVC中的Json()方法没有半毛钱关系.

那么如果想要修改MVC 中Json() 方法返回的ActionResult的日期格式,该怎么办呢?
目前发现只能凉拌, 自己搞. .net没给相关的配置. 方法是自己写一个BaseController 重写其中的 Json方法. 返回自定义的 Common.JsonNetResult

  using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MK.AppCode.MVC
{
    public class BaseController : Controller
    {

        /// <summary>
        /// 判断是否管理员
        /// </summary>
        /// <returns></returns>
        public  bool IsAdmin()
        {
            var a =  Session["IsAdmin"] as int?;
            if (a != null && a.HasValue)
            {
                return a == 1;
            }
            return false;
        }

        /// <summary>
        /// 是否超级用户能够查看所有的医院数据
        /// </summary>
        /// <returns></returns>
        public bool IsSuperuser()
        {
            var a = Session["IsSuperuser"] as int?;
            if (a != null && a.HasValue)
            {
                return a > 0; //也有值为2的时候
            }
            return false;
        }


        //
        // 摘要:
        //     创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 的 System.Web.Mvc.JsonResult 对象。
        //
        // 参数:
        //   data:
        //     要序列化的 JavaScript 对象图。
        //
        // 返回结果:
        //     将指定对象序列化为 JSON 格式的 JSON 结果对象。在执行此方法所准备的结果对象时,ASP.NET MVC 框架会将该对象写入响应。
        protected new JsonResult Json(object data)
        {
            return new Common.JsonNetResult() { Data = data, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        }
        //
        // 摘要:
        //     创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式的 System.Web.Mvc.JsonResult 对象。
        //
        // 参数:
        //   data:
        //     要序列化的 JavaScript 对象图。
        //
        //   contentType:
        //     内容类型(MIME 类型)。
        //
        // 返回结果:
        //     将指定对象序列化为 JSON 格式的 JSON 结果对象。
        protected new JsonResult Json(object data, string contentType)
        {
            return new Common.JsonNetResult() { Data = data, ContentType = contentType, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        }
        //
        // 摘要:
        //     创建 JsonResult 对象,该对象使用指定 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式。
        //
        // 参数:
        //   data:
        //     要序列化的 JavaScript 对象图。
        //
        //   behavior:
        //     JSON 请求行为。
        //
        // 返回结果:
        //     将指定对象序列化为 JSON 格式的结果对象。
        protected new JsonResult Json(object data, JsonRequestBehavior behavior)
        {
            return new Common.JsonNetResult() { Data = data, JsonRequestBehavior = behavior };
        }
        //
        // 摘要:
        //     创建一个将指定对象序列化为 JavaScript 对象表示法 (JSON) 格式的 System.Web.Mvc.JsonResult 对象。
        //
        // 参数:
        //   data:
        //     要序列化的 JavaScript 对象图。
        //
        //   contentType:
        //     内容类型(MIME 类型)。
        //
        //   contentEncoding:
        //     内容编码。
        //
        // 返回结果:
        //     将指定对象序列化为 JSON 格式的 JSON 结果对象。
        protected new virtual JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
        {
            return new Common.JsonNetResult() { Data = data, ContentType = contentType, ContentEncoding = contentEncoding };
        }
        //
        // 摘要:
        //     创建 System.Web.Mvc.JsonResult 对象,该对象使用指定内容类型和 JSON 请求行为将指定对象序列化为 JavaScript 对象表示法
        //     (JSON) 格式。
        //
        // 参数:
        //   data:
        //     要序列化的 JavaScript 对象图。
        //
        //   contentType:
        //     内容类型(MIME 类型)。
        //
        //   behavior:
        //     JSON 请求行为
        //
        // 返回结果:
        //     将指定对象序列化为 JSON 格式的结果对象。
        protected new JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
        {
            return new Common.JsonNetResult() { Data = data, ContentType = contentType, JsonRequestBehavior = behavior };
        }
        //
        // 摘要:
        //     创建 System.Web.Mvc.JsonResult 对象,该对象使用内容类型、内容编码和 JSON 请求行为将指定对象序列化为 JavaScript
        //     对象表示法 (JSON) 格式。
        //
        // 参数:
        //   data:
        //     要序列化的 JavaScript 对象图。
        //
        //   contentType:
        //     内容类型(MIME 类型)。
        //
        //   contentEncoding:
        //     内容编码。
        //
        //   behavior:
        //     JSON 请求行为
        //
        // 返回结果:
        //     将指定对象序列化为 JSON 格式的结果对象。
        protected new virtual JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
        {
            return new Common.JsonNetResult() { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior };
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; 
using System.Text; 
using System.Web.Mvc;
using Newtonsoft.Json;
 
namespace Common
{
    public class JsonNetResult : JsonResult
    {
        /// <summary>
        ///     在静态构造函数中设置JsonNet的时间处理方式
        /// </summary>
        static JsonNetResult()
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            JsonConvert.DefaultSettings = () =>
            {
                //日期类型默认格式化处理
                settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
                settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";

                return settings;
            };
        }

        /// <summary>初始化 <see cref="T:System.Web.Mvc.JsonResult" /> 类的新实例。</summary>
        public JsonNetResult()
        {
            JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        }

        /// <summary>获取或设置内容编码。</summary>
        /// <returns>内容编码。</returns>
        public Encoding ContentEncoding { get; set; }

        /// <summary>获取或设置内容的类型。</summary>
        /// <returns>内容的类型。</returns>
        public string ContentType { get; set; }

        /// <summary>获取或设置数据。</summary>
        /// <returns>数据。</returns>
        public object Data { get; set; }

        /// <summary>获取或设置一个值,该值指示是否允许来自客户端的 HTTP GET 请求。</summary>
        /// <returns>一个值,指示是否允许来自客户端的 HTTP GET 请求。</returns>
        public JsonRequestBehavior JsonRequestBehavior { get; set; }


        /// <summary>通过从 <see cref="T:System.Web.Mvc.ActionResult" /> 类继承的自定义类型,启用对操作方法结果的处理。</summary>
        /// <param name="context">执行结果时所处的上下文。</param>
        /// <exception cref="T:System.ArgumentNullException">
        ///     <paramref name="context" /> 参数为 null。
        /// </exception>
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException(nameof(context));
            if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
                string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
                throw new InvalidOperationException("不允许使用Get方法访问");
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;
            if (Data == null)
                return;

            response.Write(JsonConvert.SerializeObject(Data));
        }
    }
}

最后一个建议, 不要把MVC和Web API的代码混到一起. 容易出问题, 因为API一般是不能变的. Web API中尽量尽量不要调用 MVC中的公共方法.

参考一篇好文章.https://www.bbsmax.com/A/nAJvmn8ozr/