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

在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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值