命名空间
using System.Web.Mvc;

1:什么是过滤器?

过滤器就是在使用之前过滤一些条件。

2:为什么要用过滤器?

因为大多数情况下会有一些限制条件。列如 session过期检查  登录状态

3:了解下ActionFilterAttribute的作用?
过滤器里面有4个定义处理  方法前、方法后、返回结果前、返回结果后

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
        protected ActionFilterAttribute();
        //    在Action执行之后由 MVC 框架调用。
        public virtual void OnActionExecuted(ActionExecutedContext filterContext);
        //     在Action执行之前由 MVC 框架调用。
        public virtual void OnActionExecuting(ActionExecutingContext filterContext);
        //     在执行Result后由 MVC 框架调用。
        public virtual void OnResultExecuted(ResultExecutedContext filterContext);
        //     在执行Result之前由 MVC 框架调用。
        public virtual void OnResultExecuting(ResultExecutingContext filterContext);
    }

4:使用范围 跟特性一样

AllowMultiple 是否可以执行多个 inherit 是否继承

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] 

默认情况下Action上打了某个自定义标签后,虽然在Controller上也打上了此标签,但它只有Action上的标签起作用了。
  补充:如果Action没有打上该标签,那么Controller上的标签便会被执行。

  如果想让Action上的标签执行一次,然后Controller上的标签也执行一次,那么应该如何操作呢?

   我们只需在FilterAttribute类的定义上打上标记[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]即可【下面类的最上面红色字体部分】,也就是让其成为可以多次执行的Action

4:如何自定义过滤器?

自定义过滤器类继承过滤器类  继承ActionFilterAttribute 过滤:

一般情况下是在Mod的程序集下  建一个models文件夹在这个文件下 建一个过滤器类  eg  MMAttribute.cs 在里面写特性方法

5:带参数的过滤器

[AttributeUsage(AttributeTargets.All,AllowMultiple = true)]
    public class FilterAttribute : ActionFilterAttribute
    {
        public string Message { get; set; }
        ......

}

调用带参数的过滤器

[Filter(Message="刘备")]  //参数给上
        public ActionResult Index()
        {
            return View();
        }

6:全局的过滤器

有时我们想有些公共的方法需要每个Action都执行,但是又不想再每一个Controller上都打上Action标签,怎么办?幸好Asp。Net MVC3带

在项目APP——start下FilterConfig.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());

     //注册全局过滤器带参数filters.Add(new TestFilterAttribute() { Message="全局"});

//注册全局过滤器

filters.Add(new Test2FilterAttribute() );

}

在global.ascx中

protected void Application_Start(){AreaRegistration.RegisterAllAreas();RouteConfig.RegisterRoutes(RouteTable.Routes);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);}

如果有大多数用全局 个列不用的话 就加入这个标签 然后在方法外 【NoFilter

 //不想使用全局过滤器可使用此标签  写在自定义的类中public class NoFilter:Attribute{public NoFilter() { }}

5:常用自定义过滤器

//检查语言版本
public class LanguagesAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
//设置一个不过滤的 基础特性 查看不进行过滤特性的 长度
            object[] actionFilter = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoFilterAttr), false);
            if (actionFilter.Length == 1)
            {
                return;
            }

var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
            if (controller == "Booking")//booking 中都显示英文版
            {
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            }
            else
            {

if (filterContext.RouteData.Values["culture"] != null &&
                    !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["culture"].ToString()))
                {
                    ///从路由数据(url)里设置语言
                    var culture = filterContext.RouteData.Values["culture"].ToString();
                    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(culture);
                }
                else
                {
                    var cultureHeader = string.Empty;
                    ///如果读取cookie失败则设置默认语言
                    cultureHeader = filterContext.HttpContext.Request.UserLanguages[0];
                    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureHeader);
                    ///把语言值设置到路由值里
                    filterContext.RouteData.Values["culture"] = cultureHeader;
                }
            }

///从cookie里读取语言设置   线程资源替换cookie值
            var cookie = filterContext.HttpContext.Request.Cookies["CultureName"];
            if (cookie != null)
            {
                cookie.Value = Thread.CurrentThread.CurrentUICulture.Name;
                //filterContext.HttpContext.Response.SetCookie(cookie);//不加这句话浏览器里的cookie的值是不会变的
                // Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureHeader);
            }
            else
            {
                /// 把设置保存进cookie
                HttpCookie _cookie = new HttpCookie("CultureName", Thread.CurrentThread.CurrentUICulture.Name);
                _cookie.Expires = DateTime.Now.AddDays(1);
                filterContext.HttpContext.Response.SetCookie(_cookie);
            }
       
            base.OnActionExecuting(filterContext);
        }
    
    }

检查session
 public class CheckSessionAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var key = filterContext.HttpContext.Request.QueryString["UniqueKey"];
            if (key == null)
            {
                filterContext.Result = new RedirectResult("/");
                return;
            }
            try
            {
                var tourOrder = BookingBll.GetTourOrderByKey(key);
                if (tourOrder == null)
                {
                    filterContext.Result = new RedirectResult("/");
                    return;
                }
            }
            catch
            {
                filterContext.Result = new RedirectResult("/");
                return;
            }
            base.OnActionExecuting(filterContext);
        }
    }

//线程资源
当程序运行时,CurrentUICulture属性用来决定加载什么样的资源
而CurrentCulture属性用来决定诸如货币、数字和日期如何格式化。

然后你用浏览器访问时,系统会自动侦测出你的浏览器设置的默认语言(线程资源),然后自动调用不同的资源包来呈现出来(App_GlobalResources)中
//获取路由中的控制器名称
  var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
//获取cookie
 var loginType = HttpContext.Current.Request.Cookies["loginType"];

C#筛选器类ActionFilterAttribute相关推荐

  1. ASP.NET Web API 安全筛选器

    原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...

  2. tableau获取筛选器值_Tableau操作筛选器(Tableau Action Filters)

    Tableau操作筛选器(Tableau Action Filters) 我在Tableau中有三张纸. Sheet1是我想要进行过滤的主工作表. 我的想法是,如果用户点击那里的价值,那么会显示包含相 ...

  3. jQuery 选择器和筛选器

    1. jQuery 1. 选择器 $("") 1. 基本选择器 1. ID --> $("#d1") 2. 标签名 --> $("p&qu ...

  4. SharePoint Designer 2010创建限制筛选器

    本文将带领大家了解在SharePoint Designer 2010中如何为BCS外部内容类型创建限制筛选器.这类筛选器用于限制从我们的后端数据源返回记录的数量,以提高性能.同时,用户需要处理的数据变 ...

  5. Magicodes.IE之导入导出筛选器

    总体设计 Magicodes.IE是一个导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf.Csv和Html.在本篇教程,笔者将讲述如何使用Magicodes.IE的导入 ...

  6. Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容

    Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/public class WhiteSpaceFilter : Stream{private S ...

  7. HOWTO:将 IOCTL 发送到筛选器驱动程序

    HOWTO:将 IOCTL 发送到筛选器驱动程序 察看本文应用于的产品 <script type="text/javascript">function loadTOCN ...

  8. jquery-选择器-筛选器

    使用基本 用前要先导入js文件 使用本地文件方式导入 使用在线的文件,用时需联网 1.官网jquery压缩版引用地址: 3.1.1版本: 3.0.0版本: 2.1.4版本: 2.百度压缩版引用地址: ...

  9. jQuery查找标签--选择器,筛选器,模态对话框, 左侧菜单栏

    查找标签 选择器: 基本选择器(同css) id选择器 $("#id")标签选择器 $('tagName')class选择器 $(".className")配合 ...

最新文章

  1. c语言怎么倒计时,如何在c语言程序中插入一个倒计时命令?
  2. 【采集层】Kafka 与 Flume 如何选择
  3. Spring5 - 核心原理
  4. 用动画实现android app启动界面的渐变效果
  5. mysql 主从复制优化、并行复制
  6. hdu2089 不要62 数位dp
  7. Go 语言学习笔记(三):类型系统
  8. 模糊神经网络_神经网络模型:当网络开始产生类似于人类思维的过程
  9. jquery弹出插件
  10. CF--思维练习--CodeForces - 216C - Hiring Staff (思维+模拟)
  11. php中节点值怎么获取,php – 节点更新:获取旧值
  12. c# ref和out参数
  13. 自定义控件_水平滑动的View 自定义属性
  14. 没数据也能玩转BERT!无监督语义匹配实战
  15. 46.贪心算法练习:  区间合并
  16. VC++中OpenGL的配置
  17. 不收费的数据恢复软件_有救了!快收好这7个数据恢复神器
  18. Asp.Net Core报错System.Text.Json.JsonException: A possible object cycle was detected which is not supp
  19. 将CAD图纸中的线型和文字样式合并的方法技巧(二)
  20. 一点资讯app signature

热门文章

  1. 软件项目进度延期关键因素和应对措施
  2. PHP学习笔记4(运算符)
  3. chrom插件DHC和火狐HttpRequester插件教程
  4. java命名规范:驼峰命名法则
  5. java 微信支付异步回调接口
  6. 内盘和外盘解释|作用
  7. mooc-HTTP协议二
  8. netty4.1.32学习(持续更新)
  9. Silverlight自适应屏幕
  10. AI换脸必备知识:如何查看显卡型号以及显存大小!