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/
上一篇: ASP.NET根据日期获取星座方法!