爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
2012-12-07 16:13
281 查看
回到目录
上一篇文章已经解决了同步与异步表单提交的页面重定向问题,而为什么要写个“续”呢,原因是,我觉得上次的代码不够美丽,而且有些啰嗦,也不符合我的代码之美原则,所以,我自己的代码进行了一次重构:
两件事:
同步表单,返回view或者partialview时,事实上返回的是一个text/html格式的视图
异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格式的视图
有了上面的基础,我们把代码重构一下吧:
如果我们觉得代码还是显示有点不完善,我们可以把构建ContentResult对象的语句提取到一个方法上,把常量提升到类级别上,看修改后的代码:
值得注意的是:如果是返回text/html页面,然原来的视图将被覆盖,所以你的JS文件与CSS文件需要重新被引用才行,但如果是返回text/javascript对象,则它会使用原页面的脚本文件与样式文件,这一点要清楚。
回到目录
上一篇文章已经解决了同步与异步表单提交的页面重定向问题,而为什么要写个“续”呢,原因是,我觉得上次的代码不够美丽,而且有些啰嗦,也不符合我的代码之美原则,所以,我自己的代码进行了一次重构:
两件事:
同步表单,返回view或者partialview时,事实上返回的是一个text/html格式的视图
异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格式的视图
有了上面的基础,我们把代码重构一下吧:
/// <summary> /// 角色过滤器 /// </summary> public class RoleFilter : AuthorizeAttribute { const string USER_WARN = "您必须先登陆才能执行本操作"; const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作"; const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作"; RoleFlag _RoleFlag; /// <summary> /// 角色过滤器构造依法 /// </summary> /// <param name="roleFlag">角色类型</param> public RoleFilter(RoleFlag roleFlag) { _RoleFlag = roleFlag; } public override void OnAuthorization(AuthorizationContext filterContext) { var userID = filterContext.RequestContext.HttpContext.Session["UserID"]; var request = filterContext.RequestContext.HttpContext.Request; var routeData = filterContext.RequestContext.RouteData.Values["id"]; //同步方式 string htmlMsg = @"<html><head><title></title></head><body> <link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' /> <script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script> <script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script> <script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script> <script type='text/javascript'> $(function(){ alertHrefFun('msg','url');});</script></body></html>"; //异步方式 string jsMsg = @"alertHrefFun('msg','url');"; switch (this._RoleFlag) { case RoleFlag.User: if (userID == null || Convert.ToInt32(userID) <= 0) { var result = new ContentResult { Content = htmlMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()), ContentType = "text/html", }; if (request.IsAjaxRequest()) { result.Content = jsMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()); result.ContentType = "text/javascript"; } filterContext.Result = result; } break; default: break; } } }
如果我们觉得代码还是显示有点不完善,我们可以把构建ContentResult对象的语句提取到一个方法上,把常量提升到类级别上,看修改后的代码:
/// <summary> /// 角色过滤器 /// </summary> public class RoleFilter : AuthorizeAttribute { #region Constructs /// <summary> /// 角色过滤器构造依法 /// </summary> /// <param name="roleFlag">角色类型</param> public RoleFilter(RoleFlag roleFlag) { _RoleFlag = roleFlag; } #endregion #region Consts /// <summary> /// 必须登陆警告 /// </summary> const string USER_WARN = "您必须先登陆才能执行本操作"; /// <summary> /// 必须是工作室成员警告 /// </summary> const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作"; /// <summary> /// 必须是工作室老师警告 /// </summary> const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作"; #endregion #region Fields /// <summary> /// 同步方式 /// </summary> string htmlMsg = @"<html><head><title></title></head><body> <link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' /> <script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script> <script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script> <script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script> <script type='text/javascript'> $(function(){ alertHrefFun('msg','url');});</script></body></html>"; /// <summary> /// 异步方式 /// </summary> string jsMsg = @"alertHrefFun('msg','url');"; RoleFlag _RoleFlag; #endregion /// <summary> /// 根据请求上下文类型,返回对象 /// </summary> /// <param name="request"></param> /// <param name="jsMsg"></param> /// <param name="htmlMsg"></param> /// <returns></returns> ActionResult GetContentResult(HttpRequestBase request, string Warn) { var result = new ContentResult { Content = htmlMsg.Replace("msg", Warn).Replace("url", request.UrlReferrer.ToString()), ContentType = "text/html", }; if (request.IsAjaxRequest()) { result.Content = jsMsg.Replace("msg", Warn).Replace("url", request.UrlReferrer.ToString()); result.ContentType = "text/javascript"; } return result; } public override void OnAuthorization(AuthorizationContext filterContext) { var userID = filterContext.RequestContext.HttpContext.Session["UserID"]; var request = filterContext.RequestContext.HttpContext.Request; var routeData = filterContext.RequestContext.RouteData.Values["id"]; switch (this._RoleFlag) { case RoleFlag.User: if (userID == null || Convert.ToInt32(userID) <= 0) { filterContext.Result = GetContentResult(request, USER_WARN); } break; default: break; } } }
值得注意的是:如果是返回text/html页面,然原来的视图将被覆盖,所以你的JS文件与CSS文件需要重新被引用才行,但如果是返回text/javascript对象,则它会使用原页面的脚本文件与样式文件,这一点要清楚。
回到目录
相关文章推荐
- 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向
- 爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交
- 爱上MVC3系列~PartialView中的页面重定向
- 如何在数据库事务提交成功后进行异步操作
- 如何在数据库事务提交成功后进行异步操作
- [翻译] ASP.NET MVC Tip #6 – 提交表单后如何进行重定向
- 如何利用formData进行异步提交上传文件
- 如何在数据库事务提交成功后进行异步操作
- 异步信号如何进行同步
- jquery validate(5) : 如何进行 ajax 提交
- Appium python自动化测试系列之等待函数如何进行实战(九)
- 如何对远程对象进行异步调用(示例代码)
- Jquery点击按钮 异步和同步提交表单
- jquery validate(5) : 如何进行 ajax 提交
- nw.js node-webkit系列(15)如何使用内部模块和第三方模块进行开发
- (爱加密系列教程十三) 如何防止工具(八门神器)进行内存修改
- .NET中如何通过文本框中按回车键进行的提交数据
- github如何修改源码并进行提交方法小结
- 一道面试题:如何防止异步请求的重复提交
- 同步异步5:任务提交中的同步异步