• 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,则会使用原页面的脚本文件与样式文件

  • 相关阅读:
    js的包装对象
    js-原型
    js面向对象初识
    css3-3d
    用css制作三角形
    清浮动
    IE67下浮动元素margin-bottom值失效问题
    css圆角
    Use Memory Layout from Target Dialog Scatter File
    Qt QSting
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5623261.html
Copyright © 2020-2023  润新知