愛上MVC3系列~同步與(yu)異步提交,在過濾(lv)器里(li)如何進(jin)行重定(ding)向
MVC3+JQuery可以讓你(ni)很方便的實(shi)(shi)現表單的異步提(ti)交,之前也讀起過MVC自己的異步表單Ajax.BeginForm(),而(er)今天主(zhu)要說的是通過JQ來實(shi)(shi)現表單的提(ti)交,事實(shi)(shi)上,這在之前的文章中也詳細的說過,而(er)今天當然主(zhu)角也不(bu)是它。
今天主要的(de)問題是,在MVC的(de)Fitler中,如何實現同(tong)步提交的(de)Action與異步提交的(de)Action在Filter中的(de)URL重(zhong)定向問題,舉個(ge)例(li)子(zi),比如:
一(yi)個(ge)(ge)訪客身份,它可以(yi)看一(yi)些(xie)貼子,新聞(wen),但如(ru)果它希(xi)望回復新聞(wen)貼子的時間,則必須提示叫它去(qu)登(deng)陸(lu)(lu),對于這個(ge)(ge)回復表單事實就(jiu)是一(yi)個(ge)(ge)POST操作,而如(ru)何去(qu)提交這個(ge)(ge)POST操作就(jiu)是我們說的“提交方(fang)式”,同步與異(yi)步,而要在POST方(fang)法上加個(ge)(ge)過(guo)濾器以(yi)驗證用戶是否登(deng)陸(lu)(lu)過(guo),如(ru)果登(deng)陸(lu)(lu)成功(gong),則操作繼(ji)續進行,如(ru)果沒有登(deng)陸(lu)(lu),則實現(xian)URL的重定(ding)向,進入登(deng)陸(lu)(lu)頁。
操作流程:
---------------------------------------------------------------------------------
用戶查新聞
|
希望評論新聞
|
<是否登(deng)陸(lu)> ---N 提交用(yong)戶去(qu)登(deng)陸(lu)
| Y
評論成(cheng)功
----------------------------------------------------------------------------------
這(zhe)個(ge)流程已經足(zu)夠(gou)清晰了(le),現在我們(men)去實現它吧(ba),我不希望把這(zhe)種驗證邏(luo)輯(ji)寫在代(dai)碼里,
原因一,重復代碼高
原(yuan)因二,重復代碼多(duo)后(hou),使代碼的可維護性(xing)降(jiang)低
原因三(san),代(dai)碼(ma)臃(yong)腫,不(bu)美觀,這(zhe)不(bu)符合我的“代(dai)碼(ma)之美,代(dai)碼(ma)藝術”的原則(ze)
原因四(si),使頁(ye)面邏輯(ji)過(guo)于(yu)復雜(za)
引入過濾器
授權過濾器可以(yi)繼承自AuthorizeAttribute類,我們通(tong)常去復寫(xie)它的(de)(de)OnAuthorization方(fang)法(fa),將要進行(xing)驗證的(de)(de)邏輯寫(xie)在(zai)方(fang)法(fa)里,而filterContext就(jiu)是當(dang)然WEB請(qing)求
的上下(xia)文,如果希望得到(dao)(dao)當前頁面(mian)的Request,Response,HttpContext,RouteData等信息,可以(yi)通過(guo)它得到(dao)(dao)。
下面給出異步(bu)POST與同步(bu)POST驗證并重定向的代碼:
1 if (userID == null || Convert.ToInt32(userID) <= 0) 2 { 3 if (request.IsAjaxRequest()) 4 { 5 filterContext.Result = new ContentResult() 6 { 7 Content = ajaxMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()), 8 ContentType = "text/javascript", 9 }; 10 } 11 else 12 { 13 filterContext.RequestContext.HttpContext.Response.Clear(); 14 filterContext.HttpContext.Response.Write(_RedirectJSString.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString())); 15 } 16 17 }
注意,對于異(yi)步POST,在Controller里一般都(dou)是(shi)返回JsonResult或者(zhe)ContentResult,所(suo)以我(wo)們必須也要返回一個Javascript的(de)上下文,這樣才能(neng)使我(wo)們的(de)JS腳本執行,而(er)對于同步提(ti)交,我(wo)們要返回一個HTML頁面。
如果(guo)大家對JS異步(bu)與同步(bu)提(ti)交不(bu)清楚(chu),可(ke)以參(can)考下面代碼:
1 //異步(bu)提交 2 $.ajax({ 3 type: "Post", 4 url: "/common/review", 5 success: function (data) { 6 alert(data.res); 7 } 8 }); 9 10 //同步提(ti)交 11 $("form").submit();
感謝您的閱(yue)讀!代碼改變生活!