愛(ai)上MVC3系列~同步與(yu)異步提交,在過濾器里如何(he)進行(xing)重(zhong)定向~續
上一篇文章已經解決了同步與(yu)異步表單提交的(de)(de)頁面重(zhong)定(ding)向問題,而為(wei)什么要(yao)寫個(ge)“續”呢,原(yuan)因是,我覺得上(shang)次的(de)(de)代(dai)碼不夠美(mei)麗,而且(qie)有(you)些啰嗦,也不符合我的(de)(de)代(dai)碼之美(mei)原(yuan)則,所以,我自己(ji)的(de)(de)代(dai)碼進(jin)行了一次重(zhong)構:
兩件事:
同步表單,返回(hui)view或者partialview時,事(shi)實上返回(hui)的是一個text/html格(ge)式(shi)的視圖
異步(bu)表單,返回Json,text,xml,javascript時,事實(shi)上返回的(de)是一個(ge)text/javascript格(ge)式的(de)視圖(tu)
有了上面(mian)的基礎,我們把代碼重構一下(xia)吧(ba):
1 /// <summary> 2 /// 角色過濾器(qi) 3 /// </summary> 4 public class RoleFilter : AuthorizeAttribute 5 { 6 const string USER_WARN = "您必須先登陸才(cai)能執行本操作"; 7 const string WORKSHOPUSER_WARN = "必須是本工(gong)作室的(de)用戶(hu)才能執行本操作"; 8 const string WORKSHOPTEACHER_WARN = "必須是本(ben)工作室的老(lao)師才能執行本(ben)操作"; 9 RoleFlag _RoleFlag; 10 /// <summary> 11 /// 角色(se)過濾(lv)器構造依(yi)法(fa) 12 /// </summary> 13 /// <param name="roleFlag">角(jiao)色類型</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 //同(tong)步方式 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 //異(yi)步(bu)方式 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對(dui)象的語句提取到(dao)一(yi)個方法(fa)上,把常量提升(sheng)到(dao)類級別上,看修改后的代碼:
1 /// <summary> 2 /// 角色過濾(lv)器 3 /// </summary> 4 public class RoleFilter : AuthorizeAttribute 5 { 6 #region Constructs 7 /// <summary> 8 /// 角色過(guo)濾器構造依法(fa) 9 /// </summary> 10 /// <param name="roleFlag">角(jiao)色類型</param> 11 public RoleFilter(RoleFlag roleFlag) 12 { 13 _RoleFlag = roleFlag; 14 } 15 #endregion 16 17 #region Consts 18 /// <summary> 19 /// 必須(xu)登陸警(jing)告(gao) 20 /// </summary> 21 const string USER_WARN = "您必(bi)須先登陸才能執行本操(cao)作"; 22 /// <summary> 23 /// 必須(xu)是(shi)工(gong)作室成員警告 24 /// </summary> 25 const string WORKSHOPUSER_WARN = "必須是本工作室的用戶(hu)才能(neng)執行本操作"; 26 /// <summary> 27 /// 必須(xu)是工作室老師警告(gao) 28 /// </summary> 29 const string WORKSHOPTEACHER_WARN = "必須是本(ben)工作(zuo)(zuo)室(shi)的老(lao)師才能執行本(ben)操作(zuo)(zuo)"; 30 #endregion 31 32 #region Fields 33 /// <summary> 34 /// 同步方(fang)式(shi) 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 /// 異(yi)步方式 46 /// </summary> 47 string jsMsg = @"alertHrefFun('msg','url');"; 48 49 RoleFlag _RoleFlag; 50 #endregion 51 52 /// <summary> 53 /// 根(gen)據請(qing)求上(shang)下(xia)文類型,返回對(dui)象(xiang) 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 }
值得注意的(de)(de)是:如果是返(fan)回text/html頁(ye)面(mian),然原(yuan)來的(de)(de)視圖將被覆蓋,所以你(ni)的(de)(de)JS文(wen)(wen)件(jian)與(yu)CSS文(wen)(wen)件(jian)需要重新(xin)被引用才(cai)行,但如果是返(fan)回text/javascript對象,則它會使用原(yuan)頁(ye)面(mian)的(de)(de)腳本文(wen)(wen)件(jian)與(yu)樣式文(wen)(wen)件(jian),這一點要清(qing)楚(chu)。