• MVC 拦截指定的action


    有时,我们需要在特定的一些aciton中做校验。比如:验证是否登录。实现方式有两种:

    一、编写一个公共的方法专门用于实现是否登录的验证,然后在每个需要进行验证的aciton的头部去调用该方法,根据方法的返回值做进一步处理

    二、定义一个特性类,在特性类中去判断当前是否登录。然后在需要验证登录的aciton上加入定义的特性

    本文主要说下如何实现第二种方式。


    1、定义一个特性类,使之继承System.Web.Mvc.FilterAttribute, System.Web.Mvc.IActionFilter

          System.Web.Mvc.FilterAttribute:筛选特性的抽象基类

          System.Web.Mvc.IActionFilter:筛选器接口

    2、在特性类中实现OnActionExecuting方法。

          在System.Web.Mvc.IActionFilter中定义了两个方法:

          OnActionExecuted:在action执行后执行的方法

          OnActionExecuting:在aciton执行前执行的方法

    3、在需要进行特性过滤、拦截的action上加入定义的特性 [你的特性类]


    给大家参考下,我的项目中特性筛选应用。用于验证视图页面权限

    1)自定义的筛选特性:ValidateUrl ,完整代码如下:

    using Easyman.Managers;
    using Easyman.Sys;
    using System;
    using System.Web.Mvc;
    
    namespace Easyman.Common.Mvc
    {
        public class ValidateUrl : System.Web.Mvc.FilterAttribute, System.Web.Mvc.IActionFilter
        {
    
            #region 执行action后执行这个方法
            /// <summary>
            /// 执行action后执行这个方法
            /// </summary>
            /// <param name="filterContext"></param>
            void System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
            {
    
            }
            #endregion
    
    
            #region 执行action前执行这个方法 
            /// <summary>
            /// 执行action前执行这个方法
            /// </summary>
            /// <param name="filterContext"></param>
            void System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
            {
    
                string url = filterContext.HttpContext.Request.Url.ToString();//url路径
                string path = filterContext.HttpContext.Request.Path;//目录
                var urlRoot = url.Split(new[] { path }, StringSplitOptions.None)[0];
                var curUrl = System.Web.HttpUtility.UrlDecode(url).Substring(urlRoot.Length + 1);
                //从ioc容器中获取当前待使用接口的实例
                var _modulesService = Abp.Dependency.IocManager.Instance.Resolve<IModulesAppService>();
                var result = _modulesService.ValidateUrlRole(curUrl);
                if(!result)
                {
                    filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "Home", action = "NoAccess" }));  //重定向
                }
            }
            #endregion
        }
    }
    View Code

    2)在action上使用自定义的筛选特性:

  • 相关阅读:
    Failure [INSTALL_FAILED_ALREADY_EXISTS]
    在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver
    adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式
    【环境配置】Linux的经常使用命令
    windowsclient开发--使你的client执行时记住上次关闭的大小和位置
    【13】以对象管理资源
    C++ 初始化与赋值
    C++ 变量初始化规则
    C++ 构造和析构
    【20】宁以pass-by-reference-to-const替换pass-by-value
  • 原文地址:https://www.cnblogs.com/senyier/p/7500136.html
Copyright © 2020-2023  润新知