MVC小系列(五)【在过滤器里引入重定向】


在过滤器里引入重定向

过滤器的引入:
如果用户进行一个操作,但没有登录,
可以在Post方法上加个过滤器以验证用户是否登录,如果登录成功,则继续进行操作,如果没有登录,则实现Url的重定向,进行登录页

授权过滤器可以继承自AuthorizeAttribute类,通常重写它的OnAuthorization() 方法,将要验证的逻辑写在方法里,而filterContext就是当前web请求的上下文,如果希望得到当前页面的Request,Response,HttpContext,RouteData等信息,可以通过它得到

注意:对于异步POST,在Controller里一般都是返回JsonResult或者ContentResult,
所以必须要返回一个Javascript的上下文,这样才能让JS脚本执行,而对于同步提交,要返回一个Html页面

 1 <script>
 2 //异步提交
 3 $.ajax({
 4 type: "Post",
 5 url: "/common/review",
 6 success: function (data) {
 7 alert(data.res);
 8 }
 9 });
10 
11 //同步提交
12 $("form").submit();
13 </script>

同步表单,返回view或者partialview时,事实上返回的是一个text/html格式的视图

异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格式的视图

举个实例:

 1    public class RoleFilter : AuthorizeAttribute
 2     {
 3         const string USER_WARN = "您必须先登陆才能执行本操作";
 4         const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作";
 5         const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作";
 6         bool _roleFlag = false;
 7         public RoleFilter(bool RoleFlag)
 8         {
 9             this._roleFlag = RoleFlag;
10         }
11         public override void OnAuthorization(AuthorizationContext filterContext)
12         {
13             var userId = filterContext.RequestContext.HttpContext.Session["UserID"];
14             var request = filterContext.RequestContext.HttpContext.Request;
15             var routeData = filterContext.RequestContext.RouteData.Values["Id"];
16             //同步方式
17             string htmlMsg = @"<html><head><title></title></head><body>
18 <link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' /> 
19 <script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script>
20 <script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script>
21 <script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script>
22   <script type='text/javascript'>
23 $(function(){
24 alertHrefFun('msg','url');});</script></body></html>";
25             //异步方式
26             string jsMsg = @"alertHrefFun('msg','url');";
27 
28             switch (this._roleFlag)
29             {
30                 case false: //RoleFlag.User:
31                     if (userId == null || Convert.ToInt32(userId) <= 0)
32                     {
33                         var result = new ContentResult
34                         {
35                             Content = htmlMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()),
36                             ContentType = "text/html",
37                         };
38                         if (request.IsAjaxRequest())
39                         {
40                             result.Content = jsMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString());
41                             result.ContentType = "text/javascript";
42                         }
43                         filterContext.Result = result;
44                     }
45 
46                     break;
47                 default:
48                     break;
49             }
50         }
51     }

注意:如果是返回text/html页面,原来的视图将被覆盖,所以js文件和css文件需要重新引用才行,如果返回是text/javascript,则会使用原页面的脚本文件与样式文件

原文地址:https://www.cnblogs.com/niuzaihenmang/p/5623261.html