当前位置: 首页 > news >正文

号号网站开发柳州论坛网站建设

号号网站开发,柳州论坛网站建设,管理咨询公司技术服务,建设网站用什么好处一. 背景 在MVC框架中#xff0c;我们可能经常会用到 return Json()#xff0c;而Json方法内部又是一个JsonResult类#xff0c;那么JsonResult内部又是什么原理呢#xff1f;在MVC框架中#xff0c;各种xxxResult便捷了我们的开发#xff0c;但这些都不是本节的重点我们可能经常会用到 return Json()而Json方法内部又是一个JsonResult类那么JsonResult内部又是什么原理呢在MVC框架中各种xxxResult便捷了我们的开发但这些都不是本节的重点在这里我们只需要知道JsonResult内部的原理即可。 JsonResult内部原理是基于 JavaScriptSerializer来做的序列化在使用过程中有这么几个弊端 ①DateTime类型返回给前端格式不友好\/Date(1535009968228)\/ 相当别扭。PS前端有很多办法处理的 ②对于前端而言对于属性名可能更倾向于小写开头但在C#中很多都是大写但JsonResult将原结果默认返回给前端前端人员可能会有点小不爽。(PS这也可以算作是一个习惯问题没有明确的对错) ③循环引用的问题。 关于使用Newtonsoft.Json改造MVC默认的JsonResult有很多种方式本节仅是整理了一下在我日常开发中的使用方法。PS这里的MVC版本为 5.2.4.0 这里简单的分析一下JsonResult的源码 ①继承了ActionResult, 实现了ExecuteResult方法。 ②解读源码可知JsonResult内部实现原理是调用了JavaScriptSerializer对象中的Serialize方法,将Json对象转换成了Json字符串通过response.Write(javaScriptSerializer.Serialize(this.Data)); 传递给前台。 ③默认是禁止Get请求访问的. JsonRequestBehavior.DenyGet。 ④在MVC的Action中,return Json(),这里的Json通过源码可知即new了一个JsonResult对象而已,并且MVC中封装了很多重载。 本节涉及到的知识点有 1. MVC中的各种Result可参考http://www.cnblogs.com/yaopengfei/p/7910767.html 2. MVC中的过滤器可参考https://www.cnblogs.com/yaopengfei/p/7910763.html 二. 测试JsonResult的弊端 这里主要测试一下DateTime类型“乱码”时间戳问题和默认大小写问题。 后台代码 1 public ActionResult Json1()2 {3 var msg new4 {5 ID 1,6 Name ypf1,7 time DateTime.Now8 };9 return Json(msg); 10 } 前台代码 1 $(#btn1).on(click, function () { 2 $.post(Json1, {}, function (data) { 3 console.log(data); 4 }); 5 }); 测试结果 下面提供一种解决时间戳转换的问题使用该js文件对Date类型进行扩展代码如下 View Code 在前端这么使用就可以将时间转换成正常的显示详细的见上面的代码 三. 自我改造 有了前面的JsonResult的代码分析这里先写一种最简单粗暴的改造方式当然需要实现安装 Newtonsoft.Json程序集。 改造方案一 新建YpfSimpleJsonResult类继承ActionResult类利用构造函数传递数据override ExecuteResult方法在里面利用Newtonsoft进行改写代码如下 1 /// summary2 /// 简洁版的改写只是替换了实现方式3 /// /summary4 public class YpfSimpleJsonResult : ActionResult5 {6 private object _Data null;7 public YpfSimpleJsonResult(object data)8 {9 this._Data data; 10 } 11 public override void ExecuteResult(ControllerContext context) 12 { 13 context.HttpContext.Response.ContentType application/json; 14 context.HttpContext.Response.Write(JsonConvert.SerializeObject(this._Data)); 15 } 16 } 测试接口 1 public ActionResult Json3()2 {3 var msg new4 {5 ID 1,6 Name ypf1,7 time DateTime.Now8 };9 return new YpfSimpleJsonResult(msg); 10 } 测试结果 改造方案二 有了上面的方案的基础下面深度改造一下新建YpfJsonResult类直接继承高层封装JsonResult类并配置引用问题、默认小写问题、自定义时间格式代码如下 1 public class YpfJsonResult : JsonResult2 {3 public YpfJsonResult()4 {5 Settings new JsonSerializerSettings6 {7 //1. 忽略循环引用问题建议设置为Error这样的话遇到循环引用的时候报错8 ReferenceLoopHandling ReferenceLoopHandling.Ignore,9 //2. 日期格式化这里可以将Newtonsoft默认的格式进行修改 10 DateFormatString yyyy-MM-dd HH:mm:ss, 11 //3. 设置属性为开头字母小写的驼峰命名 12 ContractResolver new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() 13 }; 14 } 15 16 public JsonSerializerSettings Settings { get; private set; } 17 18 public override void ExecuteResult(ControllerContext context) 19 { 20 if (context null) 21 { 22 throw new ArgumentNullException(context); 23 } 24 if (this.JsonRequestBehavior JsonRequestBehavior.DenyGet string.Equals(context.HttpContext.Request.HttpMethod, GET, StringComparison.OrdinalIgnoreCase)) 25 { 26 throw new InvalidOperationException(GET is not allowed); 27 } 28 HttpResponseBase response context.HttpContext.Response; 29 response.ContentType string.IsNullOrEmpty(this.ContentType) ? application/json : this.ContentType; 30 if (this.ContentEncoding ! null) 31 { 32 response.ContentEncoding this.ContentEncoding; 33 } 34 if (this.Data null) 35 { 36 return; 37 } 38 var scriptSerializer JsonSerializer.Create(this.Settings); 39 scriptSerializer.Serialize(response.Output, this.Data); 40 } 41 } 测试接口 1 public ActionResult Json2()2 {3 var msg new4 {5 ID 1,6 Name ypf1,7 time DateTime.Now8 };9 //注意这里的Data是JsonResult类中的一个获取和设置数据的属性。 10 return new YpfJsonResult() { Data msg }; 11 } 测试结果 总结 虽然我们通过第二套方案已经达到了我们的目的但它存在一个弊端就是侵入性太强每个方法中都要改写那么有没有一种方式可以全局控制呢 显然是有的可以考虑使用全局过滤器。 四. 全局处理 这里换一种思路通过注册一个全局过滤器对每个Action进行监测如果使用的是JsonResult就把JsonResult替换成自己编写的YpfJsonResult这样的话业务中的调用代码不需要发生任何变化仍然可以使用 return Json()方法。 特别注意这里的过滤器要使用行为过滤器并且要在OnActionExecuted方法中进行业务的编写。(这是过滤器执行顺序决定的) 代码分享 过滤器代码 编写完过滤器后需要全局注册一下 可以在在FilterConfig文件中注册 filters.Add(new YpfJsonFilter()); 或者直接去Global文件中GlobalFilters.Filters.Add(new YpfJsonFilter()); 代码来注册道理都一样 接口代码不需要做任何改变继续沿用return Json()即可。 测试结果 ! 作       者 : Yaopengfei(姚鹏飞)博客地址 : http://www.cnblogs.com/yaopengfei/声     明1 : 本人才疏学浅用郭德纲的话说“我是一个小学生”如有错误欢迎讨论请勿谩骂^_^。声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址否则保留追究法律责任的权利。
http://www.zqtcl.cn/news/200727/

相关文章:

  • 深圳宝安p2p网站系统的建设百度广告联盟标识
  • 企业网站备案怎么填写东莞市场监督管理局官网
  • 网站建站网站91955内蒙古建设集团招聘信息网站
  • 巴中建设厅网站电话seo是网络优化吗
  • 中国做投资的网站做网站的公司怎么推广
  • 专业的广州微网站建设移动应用开发干什么的
  • 网站运营有什么用常熟智能网站开发
  • 如何组建做网站的团队绍兴网站建设推广
  • 资讯类响应式网站模板深圳网站建设培训机构
  • 电子商务网站功能设计3d动画制作过程
  • 随机网站生成器win7asp+sql server 2008做网站
  • 金本网站建设设计江苏建筑业网
  • 校园网站建设的作用淄博网站建设网站推广优化
  • 域名过期了怎么办怎么找回网站校友录网站开发设计
  • 医疗 企业 网站建设seo网络优化是什么工作
  • e时代速递搜索引擎网站建设aso关键词搜索优化
  • 产品单页营销型网站模板龙华网站建设深圳信科
  • 建网站平台要多少钱投资公司取名字大全
  • 建设网站需要哪些设备重庆本地建站
  • 学做家常菜去那个网站专业制作网站制作
  • 合肥网站建设公网站程序如何上传
  • 潍坊网站建设招聘官方网站建设 在线磐石网络
  • 校友网站建设开一个网站的流程
  • 商业门户网站是什么意思哪家培训机构学校好
  • 青岛企业网站制作seo排名优化培训网站
  • 2018做网站还是app上海搜索seo
  • 网站建设用模板好吗罗湖网站制作费用
  • 网站图片延时加载app推广视频
  • 郑州设计师网站个人搭建网站要多少钱
  • 网站制作成品下载wordpress怎么更改样式