爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
回到目录
上一篇文章已经解决了同步与异步表单提交的页面重定向问题,而为什么要写个“续”呢,原因是,我觉得上次的代码不够美丽,而且有些啰嗦,也不符合我的代码之美原则,所以,我自己的代码进行了一次重构:
两件事:
同步表单,返回view或者partialview时,事实上返回的是一个text/html格式的视图
异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格式的视图
有了上面的基础,我们把代码重构一下吧:
1 /// <summary> 2 /// 角色过滤器 3 /// </summary> 4 public class RoleFilter : AuthorizeAttribute 5 { 6 const string USER_WARN = "您必须先登陆才能执行本操作"; 7 const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作"; 8 const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作"; 9 RoleFlag _RoleFlag; 10 /// <summary> 11 /// 角色过滤器构造依法 12 /// </summary> 13 /// <param name="roleFlag">角色类型</param> 14 public RoleFilter(RoleFlag roleFlag) 15 { 16 _RoleFlag = roleFlag; 17 } 18 public override void OnAuthorization(AuthorizationContext filterContext) 19 { 20 var userID = filterContext.RequestContext.HttpContext.Session["UserID"]; 21 var request = filterContext.RequestContext.HttpContext.Request; 22 var routeData = filterContext.RequestContext.RouteData.Values["id"]; 23 //同步方式 24 string htmlMsg = @"<html><head><title></title></head><body> 25 <link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' /> 26 <script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script> 27 <script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script> 28 <script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script> 29 <script type='text/javascript'> 30 $(function(){ 31 alertHrefFun('msg','url');});</script></body></html>"; 32 //异步方式 33 string jsMsg = @"alertHrefFun('msg','url');"; 34 35 switch (this._RoleFlag) 36 { 37 case RoleFlag.User: 38 if (userID == null || Convert.ToInt32(userID) <= 0) 39 { 40 var result = new ContentResult 41 { 42 Content = htmlMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()), 43 ContentType = "text/html", 44 }; 45 if (request.IsAjaxRequest()) 46 { 47 result.Content = jsMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()); 48 result.ContentType = "text/javascript"; 49 } 50 filterContext.Result = result; 51 } 52 53 break; 54 default: 55 break; 56 } 57 } 58 }
如果我们觉得代码还是显示有点不完善,我们可以把构建ContentResult对象的语句提取到一个方法上,把常量提升到类级别上,看修改后的代码:
1 /// <summary> 2 /// 角色过滤器 3 /// </summary> 4 public class RoleFilter : AuthorizeAttribute 5 { 6 #region Constructs 7 /// <summary> 8 /// 角色过滤器构造依法 9 /// </summary> 10 /// <param name="roleFlag">角色类型</param> 11 public RoleFilter(RoleFlag roleFlag) 12 { 13 _RoleFlag = roleFlag; 14 } 15 #endregion 16 17 #region Consts 18 /// <summary> 19 /// 必须登陆警告 20 /// </summary> 21 const string USER_WARN = "您必须先登陆才能执行本操作"; 22 /// <summary> 23 /// 必须是工作室成员警告 24 /// </summary> 25 const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作"; 26 /// <summary> 27 /// 必须是工作室老师警告 28 /// </summary> 29 const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作"; 30 #endregion 31 32 #region Fields 33 /// <summary> 34 /// 同步方式 35 /// </summary> 36 string htmlMsg = @"<html><head><title></title></head><body> 37 <link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' /> 38 <script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script> 39 <script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script> 40 <script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script> 41 <script type='text/javascript'> 42 $(function(){ 43 alertHrefFun('msg','url');});</script></body></html>"; 44 /// <summary> 45 /// 异步方式 46 /// </summary> 47 string jsMsg = @"alertHrefFun('msg','url');"; 48 49 RoleFlag _RoleFlag; 50 #endregion 51 52 /// <summary> 53 /// 根据请求上下文类型,返回对象 54 /// </summary> 55 /// <param name="request"></param> 56 /// <param name="jsMsg"></param> 57 /// <param name="htmlMsg"></param> 58 /// <returns></returns> 59 ActionResult GetContentResult(HttpRequestBase request, string Warn) 60 { 61 var result = new ContentResult 62 { 63 Content = htmlMsg.Replace("msg", Warn).Replace("url", request.UrlReferrer.ToString()), 64 ContentType = "text/html", 65 }; 66 if (request.IsAjaxRequest()) 67 { 68 result.Content = jsMsg.Replace("msg", Warn).Replace("url", request.UrlReferrer.ToString()); 69 result.ContentType = "text/javascript"; 70 } 71 return result; 72 } 73 74 public override void OnAuthorization(AuthorizationContext filterContext) 75 { 76 var userID = filterContext.RequestContext.HttpContext.Session["UserID"]; 77 var request = filterContext.RequestContext.HttpContext.Request; 78 var routeData = filterContext.RequestContext.RouteData.Values["id"]; 79 switch (this._RoleFlag) 80 { 81 case RoleFlag.User: 82 if (userID == null || Convert.ToInt32(userID) <= 0) 83 { 84 filterContext.Result = GetContentResult(request, USER_WARN); 85 } 86 87 break; 88 default: 89 break; 90 } 91 } 92 }
值得注意的是:如果是返回text/html页面,然原来的视图将被覆盖,所以你的JS文件与CSS文件需要重新被引用才行,但如果是返回text/javascript对象,则它会使用原页面的脚本文件与样式文件,这一点要清楚。
回到目录
爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续相关推荐
- 爱上MVC3系列~分部视图中的POST
在PartialView中进行表单提交,有什么用呢,我来总结一下: 1 这个表单不只一个地方用到 2 可能涉及到异步的提交问题 这两种情况都有可能需要把表单建立在"分部视图"中,我 ...
- ajax同步和异步提交的区别
/**获取用户登录信息返回值:如果用户已登录返回登录信息,否则返回false */ function get_user_info() {var url = PUB_URL+"get_user ...
- Fastapi系列-同步和异步相互转换处理实践
前言 我们知道Fastapi本身是一个混搭的框架,它既可以使用同步的方式也可以使用的异步的方式来运行我们的服务. 同步的方式主要是使用多线程的方式来实现并发 异步的方式则主要是基于协程的方式来实现并发 ...
- 爱上MVC3系列~开发一个站点地图(俗称面包屑)
回到目录 原来早在webform控件时代就有了SiteMap这个东西,而进行MVC时代后,我们也希望有这样一个东西,它为我们提供了不少方便,如很方便的实现页面导航的内容修改,页面导航的样式换肤等. 我 ...
- 白话解说:阻塞和非阻塞,同步和异步
阻塞和非阻塞,同步和异步是node.js里经常遇到的词汇,举例说明: 我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房.家里有2个水壶,一个是普通的水壶,另一个是水开了会叫的那种水壶.我可 ...
- javascript中BOM介绍、屏幕尺寸、历史记录、URL解析、计算机信息获取、定时器、三大系列及兼容代码、封装动画函数、同步和异步
BOM介绍: BOM指的是浏览器对象模型,是用来操作浏览器的,例如浏览器弹窗.地址栏.滚动条等,浏览器顶级对象:window:页面中的所有内容都是属于window的,window可以省略:confir ...
- 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念...
开篇介绍 在 SSIS Dataflow 数据流中的组件可以分为 Synchronous 同步和 Asynchronous 异步这两种类型. 同步与异步 Synchronous and Asynchr ...
- alwayson的同步提交和异步提交
1.2 同步提交与异步提交 2016-6-1 高可用性 1.2.1 日志传输 AlwaysOn 可用性组.数据库镜像等解决方案需要为主数据库建立一个或多个"热备用"或"温 ...
- 跟着我从零开始入门FPGA(一周入门XXOO系列)-5、同步和异步设计
(本连载共七部分,这是第五部分) 作者:McuPlayer2013 (EETOP FPGA版块版主) 原帖地址:http://bbs.eetop.cn/thread-385362-1-1.html ...
最新文章
- 图像配准----RANSAC
- JSON Web Token - 在Web应用间安全地传递信息
- Choose the Right Search Solution
- android pod 组件化_使用 Pod 实现私有模块化管理(组件化 Pods 实现方案)
- undefined reference to '__gxx_personality_v0'
- 北京一公交车发生爆炸 疑为乘客携带药品起反应
- Nginx 快速搭建HTTP 文件服务器
- linux init进程原理,Linux 系统下 init 进程的前世今生
- 36岁程序员:领导平时称兄道弟,裁员时立刻变脸,看透人性
- PossibleSums
- Ubuntu 安装mujoco
- C语言程序入门(零基础入门)
- Android布局小案例——安卓版计算器
- spyder替换_Spyder快捷键
- 高三数学微课堂【教学视频】
- 计算机硬件组成框图,以及各部件的作用及计算机系统的主要技术指标概念理解
- 64Mbit SOIC8封装SPI接口的国产串行SRAM EMI7064
- 【存储过程造数mysql】
- 日本80年代芯片战后二次决战
- 一个字符等于多少个字节?
热门文章
- C语言实现音乐播放器 客户端相关函数解析(部分
- Qt中为工程添加资源文件、给按钮添加图片
- c.kdocs cn二维码_二维码防窜货解决方案,物流动向尽在掌握
- java静态和动态的区别是什么意思_Java中的动态和静态多态性有什么区别?
- 泛华金控携手神策数据,赋能保险经代公司筑就全闭环智能营销
- 从 2017 ChinaJoy 谈起,中国游戏如何数据化前行
- 教你用java统计目录下所有文档的词频
- java中执行js代码
- centos6.5环境下zookeeper-3.4.6集群环境部署及单机部署详解
- Java_StringBuffer类