MVC3+JQuery可以讓你很方便的實現表單的異步提交,之前也讀起過MVC自己的異步表單Ajax.BeginForm(),而今天主要說的是通過JQ來實現表單的提交,事實上,這在之前的文章中也詳細的說過,而今天當然主角也不是它。
今天主要的問題是,在MVC的Fitler中,如何實現同步提交的Action與異步提交的Action在Filter中的URL重定向問題,舉個例子,比如:
一個訪客身份,它可以看一些貼子,新聞,但如果它希望回復新聞貼子的時間,則必須提示叫它去登陸,對於這個回復表單事實就是一個POST操作,而如何去提交這個POST操作就是我們說的“提交方式”,同步與異步,而要在POST方法上加個過濾器以驗證用戶是否登陸過,如果登陸成功,則操作繼續進行,如果沒有登陸,則實現URL的重定向,進入登陸頁。
操作流程:
---------------------------------------------------------------------------------
用戶查新聞
|
希望評論新聞
|
<是否登陸> ---N 提交用戶去登陸
| Y
評論成功
----------------------------------------------------------------------------------
這個流程已經足夠清晰了,現在我們去實現它吧,我不希望把這種驗證邏輯寫在代碼里,
原因一,重復代碼高
原因二,重復代碼多后,使代碼的可維護性降低
原因三,代碼臃腫,不美觀,這不符合我的“代碼之美,代碼藝術”的原則
原因四,使頁面邏輯過於復雜
引入過濾器
授權過濾器可以繼承自AuthorizeAttribute類,我們通常去復寫它的OnAuthorization方法,將要進行驗證的邏輯寫在方法里,而filterContext就是當然WEB請求
的上下文,如果希望得到當前頁面的Request,Response,HttpContext,RouteData等信息,可以通過它得到。
下面給出異步POST與同步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 }
注意,對於異步POST,在Controller里一般都是返回JsonResult或者ContentResult,所以我們必須也要返回一個Javascript的上下文,這樣才能使我們的JS腳本執行,而對於同步提交,我們要返回一個HTML頁面。
如果大家對JS異步與同步提交不清楚,可以參考下面代碼:
1 //異步提交 2 $.ajax({ 3 type: "Post", 4 url: "/common/review", 5 success: function (data) { 6 alert(data.res); 7 } 8 }); 9 10 //同步提交 11 $("form").submit();
感謝您的閱讀!代碼改變生活!