命名空间
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"];