C#筛选器类ActionFilterAttribute
命名空间
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相关推荐
- ASP.NET Web API 安全筛选器
原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...
- tableau获取筛选器值_Tableau操作筛选器(Tableau Action Filters)
Tableau操作筛选器(Tableau Action Filters) 我在Tableau中有三张纸. Sheet1是我想要进行过滤的主工作表. 我的想法是,如果用户点击那里的价值,那么会显示包含相 ...
- jQuery 选择器和筛选器
1. jQuery 1. 选择器 $("") 1. 基本选择器 1. ID --> $("#d1") 2. 标签名 --> $("p&qu ...
- SharePoint Designer 2010创建限制筛选器
本文将带领大家了解在SharePoint Designer 2010中如何为BCS外部内容类型创建限制筛选器.这类筛选器用于限制从我们的后端数据源返回记录的数量,以提高性能.同时,用户需要处理的数据变 ...
- Magicodes.IE之导入导出筛选器
总体设计 Magicodes.IE是一个导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf.Csv和Html.在本篇教程,笔者将讲述如何使用Magicodes.IE的导入 ...
- Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/public class WhiteSpaceFilter : Stream{private S ...
- HOWTO:将 IOCTL 发送到筛选器驱动程序
HOWTO:将 IOCTL 发送到筛选器驱动程序 察看本文应用于的产品 <script type="text/javascript">function loadTOCN ...
- jquery-选择器-筛选器
使用基本 用前要先导入js文件 使用本地文件方式导入 使用在线的文件,用时需联网 1.官网jquery压缩版引用地址: 3.1.1版本: 3.0.0版本: 2.1.4版本: 2.百度压缩版引用地址: ...
- jQuery查找标签--选择器,筛选器,模态对话框, 左侧菜单栏
查找标签 选择器: 基本选择器(同css) id选择器 $("#id")标签选择器 $('tagName')class选择器 $(".className")配合 ...
最新文章
- c语言怎么倒计时,如何在c语言程序中插入一个倒计时命令?
- 【采集层】Kafka 与 Flume 如何选择
- Spring5 - 核心原理
- 用动画实现android app启动界面的渐变效果
- mysql 主从复制优化、并行复制
- hdu2089 不要62 数位dp
- Go 语言学习笔记(三):类型系统
- 模糊神经网络_神经网络模型:当网络开始产生类似于人类思维的过程
- jquery弹出插件
- CF--思维练习--CodeForces - 216C - Hiring Staff (思维+模拟)
- php中节点值怎么获取,php – 节点更新:获取旧值
- c# ref和out参数
- 自定义控件_水平滑动的View 自定义属性
- 没数据也能玩转BERT!无监督语义匹配实战
- 46.贪心算法练习: 区间合并
- VC++中OpenGL的配置
- 不收费的数据恢复软件_有救了!快收好这7个数据恢复神器
- Asp.Net Core报错System.Text.Json.JsonException: A possible object cycle was detected which is not supp
- 将CAD图纸中的线型和文字样式合并的方法技巧(二)
- 一点资讯app signature