愛上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系列~同步與非同步提交,在過濾器裡如何進行重定向~續,如需轉載請自行聯絡原博主。
相關文章
- 同步與非同步 阻塞與非阻塞非同步
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 同步非同步 與 阻塞非阻塞非同步
- 同步、非同步、阻塞與非阻塞非同步
- 程式與執行緒、同步與非同步、阻塞與非阻塞、併發與並行執行緒非同步並行
- [轉]阻塞/非阻塞與同步/非同步非同步
- 同步與非同步、阻塞與非阻塞的理解非同步
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 非同步提交非同步
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步、阻塞、非阻塞非同步
- 執行緒與同步非同步執行緒非同步
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 理解阻塞、非阻塞、同步、非同步非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞和非阻塞非同步
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- 在Linux中,rsync 同步資料時,如何過濾出所有.txt的檔案不同步?Linux
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- JS執行機制--同步與非同步JS非同步
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- 透過一個示例形象地理解C# async await 非並行非同步、並行非同步、並行非同步的併發量控制C#AI並行非同步
- 在虛擬機器上同步伺服器上的時間_Hbase虛擬機伺服器
- 同步、非同步、阻塞、非阻塞的區別非同步
- 點雲濾波器與過濾器過濾器
- 【OS】同步非同步/阻塞非阻塞、併發並行序列的區分非同步並行
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- QT執行緒同步與非同步處理QT執行緒非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 同步、非同步、阻塞、非阻塞的簡單理解非同步
- commit 的非同步提交MIT非同步
- 非同步提交(Asynchronous COMMIT)非同步MIT
- java同步非阻塞IOJava
- 非同步和非阻塞非同步