愛上MVC3系列~同步與非同步提交,在過濾器裡如何進行重定向~續

mcy247發表於2017-12-06

上一篇文章已經解決了同步與非同步表單提交的頁面重定向問題,而為什麼要寫個“續”呢,原因是,我覺得上次的程式碼不夠美麗,而且有些囉嗦,也不符合我的程式碼之美原則,所以,我自己的程式碼進行了一次重構:

兩件事:

同步表單,返回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系列~同步與非同步提交,在過濾器裡如何進行重定向~續,如需轉載請自行聯絡原博主。


相關文章