CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记
- 什么是过滤器
过滤器:把附加逻辑注入到请求管道
- MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。
如下表:
现在先看一下这些默认实现类都继承了什么东西
如果我们实现了FilterAttribute以及对应的接口,是否可以创建“自定义的过滤器”?答案是肯定的。下面看一下例子,简单权限过滤器的实现,和异常过滤器的实现。
先看一下系统提供的FilterAttribute类,有个印象就行
namespace System.Web.Mvc
{
// 摘要:
// 表示操作和结果筛选器特性的基类。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public abstract class FilterAttribute : Attribute, IMvcFilter
{
// 摘要:
// 初始化 System.Web.Mvc.FilterAttribute 类的新实例。
protected FilterAttribute();
// 摘要:
// 获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。
//
// 返回结果:
// 如果可指定筛选器特性的多个实例,则为 true;否则为 false。
public bool AllowMultiple { get; }
//
// 摘要:
// 获取或者设置执行操作筛选器的顺序。
//
// 返回结果:
// 执行操作筛选器的顺序。默认值为-1 越小越优先执行
public int Order { get; set; }
}
}
从上面系统提供的代码中,可以看到,他们提供了一个Order属性,用来指定帅选顺序,如果我们自定义的过滤器继承了这个类
那么我们就可以直接使用这个order属性了如:
[MyException(Order=1)]//使用自定义的异常类,并制定顺序
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
权限过滤器
public class MyAuthorAttribute : FilterAttribute, IAuthorizationFilter
{
/// <summary>
/// 这两个自定义的属性用来接受我们传递的值,传递方式:
/// [MyAuthor(admin="adm",password="123")]
/// 如果不需要,也可以不传递,如: [MyAuthor],当然如果用不到,你也可以不定义这两个属性
/// </summary>
public string admin;
public string password;
public void OnAuthorization(AuthorizationContext filterContext)
{
/*
*
*
这里写自己的判断逻辑,读数据库,session ,Cookes等等
*
*
*/
if (1 > 0)//可在这里判断验证结果,如果失败啊...成功啊...等等
{
//跳转到登陆页面
filterContext.Result = new RedirectResult("/admin/login?" + admin);
}
else
{
}
}
}
权限过滤器在控制器中使用方式
[MyAuthor(admin = "admin", password = "123456")]
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
自定义异常过滤器类的简单实现
public class MyExceptionAttribute : FilterAttribute, IExceptionFilter
{
void IExceptionFilter.OnException(ExceptionContext filterContext)
{
//出现异常后,设置一下操作结果
filterContext.Result = new RedirectResult("/admin/error");
//设定一个值,用来指定其为已处理异常,这个地方必须设置
filterContext.ExceptionHandled = true;
}
}
自定义异常过滤器在控制器中的使用方式
[MyAuthor(admin = "admin", password = "123456",Order=1)]
[MyException]
public ActionResult Index(string str)
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
int s = str.Length;
return View();
}
[MyException(Order=1)]//使用自定义的异常类,并制定顺序
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
使用全局过滤器
当需要让过滤器应用于MVC应用程序的所有动作方法上的时候,可以考虑全局过滤器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace MvcApplication1
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
//我们只要在这个函数里添加一个过滤器就行了
//这一句话的意思是,注册过滤器为全局的
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
}
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());//默认的
filters.Add(new MyExceptionAttribute());//自定义的.本行为自己添加的
//其实,异常过滤器我们不必重写,一般只需要修改一下默认的异常控制器类的属性就行了
/*
filters.Add(new HandleErrorAttribute() {
ExceptionType=typeof(Exception),View="error"
});
*/
}
}
}