ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要
ASP.NET MVC 3.0(二): MVC的概念及MVC 3.0开发环境
ASP.NET MVC 3.0(三): 初识MVC的Url映射潜规则Routing
ASP.NET MVC 3.0(四): 我要MVC潜规则之配置Routing
ASP.NET MVC 3.0(五): 入手Controller/Action
ASP.NET MVC 3.0(六): MVC 3.0创建你的View视图
ASP.NET MVC 3.0(七): MVC 3.0 新的Razor引擎
ASP.NET MVC 3.0(八): MVC 3.0 传递和保存你的Model
ASP.NET MVC 3.0(九): MVC 3.0 验证你的Model
ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证
ASP.NET MVC 3.0(十一): MVC 3.0 使用筛选器
ASP.NET MVC 3.0(十二): MVC 3.0 使用自定义的Html控件
ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击
ASP.NET MVC 3.0(十四): MVC 3.0 实例系列之创建数据表格
ASP.NET MVC 3.0(十五): MVC 3.0 实例系列之表格的排序
ASP.NET MVC 3.0(十六): MVC 3.0 实例系列之表格数据的分页
ASP.NET MVC 3.0(十七): MVC 3.0 实例之表格中数据的筛选
ASP.NET MVC 3.0(十八): MVC 3.0 实例系列之表格中合并排序、分页和筛选
ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页
概述
在 ASP.NET MVC 中,控制器将定义一些操作方法,这些操作方法与可能的用户交互(如单击链接或提交窗体)之间通常具有一一对应关系。 例如,当用户单击链接时,会将请求路由到指定的控制器,然后调用对应的操作方法。 例如操作完成后你要产生日志、语言筛选、等其他动态操作。
筛选器的由来及用途
有时,您需要在调用操作方法之前或运行操作方法之后执行逻辑。
筛选器是自定义类,可提供用于向控制器操作方法添加操作前行为和操作后行为的声明性和编程性手段。
操作筛选器的某些可能用途包括:
-
日志记录,目的是跟踪用户交互。
-
“反图像攫取”,用于防止在自己网站之外的网页中加载图像。
-
爬网程序筛选,用于根据浏览器用户代理来更改应用程序行为。
-
本地化,用于设定区域设置。
-
动态操作,用于将操作注入到控制器中。
ASP.NET MVC 筛选器的类型
ASP.NET MVC 支持以下类型的操作筛选器:
-
授权筛选器在任何其他筛选器之前运行。
-
OnActionExecuted 在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。
-
OutputCacheAttribute 类是结果筛选器的一个示例。
-
HandleErrorAttribute 类是异常筛选器的一个示例。
ASP.NET MVC提供的筛选器
筛选器可在操作方法、控制器或应用程序级别上应用。
-
通过身份验证和授权(可选)限制访问。 如:[Authorize]
-
customErrors 元素。
-
提供输出缓存。
-
强制不安全的 HTTP 请求通过 HTTPS 重新发送。
筛选器运行顺序
筛选器按下列顺序运行:
-
授权筛选器
-
操作筛选器
-
响应筛选器
-
异常筛选器
此枚举将定义以下筛选器范围值(按它们运行的顺序):
-
First
-
Global
-
Controller
-
Action
-
Last
例如,其 Order 属性设置为 0 且筛选器范围设置为 First 的操作筛选器将在其 Order 属性设置为 0 且筛选器范围设置为 Action 的操作筛选器之前运行。
未定义具有相同类型、顺序和范围的筛选器的执行顺序。
取消筛选器的执行
所有 OnResultExecuting和 OnResultExecuted 筛选器都会运行。
实例:创建自定义操作筛选器
回顾一下ASP.NET MVC 操作筛选器的执行顺序,框架将先调用操作筛选器的 OnActionExecuting 方法,然后再调用以操作筛选器特性标记的任意操作方法。 OnActionExecuted 方法。
这些方法对于执行日志记录、缓存输出结果之类的操作非常有用。
创建一个名为LoggingFilterAttribute的类
跟上面所说一样该类继承了ActionFilterAttribute表示操作特性的基类。
代码
publicclass LoggingFilterAttribute : ActionFilterAttribute
{
publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess1"] ="正要加载"+ filterContext.ActionDescriptor.ActionName +"方法";
base.OnActionExecuting(filterContext);
}
publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess2"] = filterContext.ActionDescriptor.ActionName +"方法加载完毕";
base.OnActionExecuted(filterContext);
}
}
此处我们只是设置了两个值,放在页面上做对照,完全可以换成日志功能。
调用操作筛选器
在Controller中新建Index方法在上面加上刚刚定义的筛选标志[LoggingFilter]
//
// GET: /Person/
[LoggingFilter]
public ActionResult Index()
{
ViewData["mess1"] ="mess1";
ViewData["mess2"] ="mess2";
return View(GetData());
}
View代码
<h2>@ViewData["mess1"]</h2>
<h2>@ViewData["mess2"]</h2>
运行效果
这一结果完全验证了,筛选器的工作顺序。OnActionExecuting-->Action-->OnActionExecuted
如果有多个筛选的话我们可以用Order来将他们一一列出顺序。默认Order为-1.
//
// GET: /Person/
[LoggingFilter(Order =1)]
[LoggingFilter1(Order =0)]
public ActionResult Index()
{
ViewData["mess1"] ="mess1";
ViewData["mess2"] ="mess2";
return View(GetData());
}
这样就会先执行LoggingFilter1后执行LoggingFilter。
对指定的控制器采用不同的筛选
在ASP.NET MVC Controller 类中我们可以重写的 OnActionExecuting 和 OnActionExecuted 方法。
此功能类似于操作筛选器,但方法局限于控制器范围。
此时我们就不需要单独去在Action上面去调用他了,因为该Controller 中的筛选已经被重写。并且仅属于该Controller 。
代码
[NonAction]
protectedoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess1"] ="正要加载"+ filterContext.ActionDescriptor.ActionName +"方法";
base.OnActionExecuting(filterContext);
}
[NonAction]
protectedoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
{
//可以自行添加一些控制代码
filterContext.Controller.ViewData["mess2"] = filterContext.ActionDescriptor.ActionName +"方法加载完毕";
base.OnActionExecuted(filterContext);
}
运行效果与上面的一样
总结
有了筛选器我们的程序变的完美了,权限、操作、响应、异常这一系列的问题都完全被我们自己掌控,成为我们自己的规则,程序可控性更高。
转:记忆逝去的青春 http://www.cnblogs.com/lukun/