ASP.NET MVC2.0 自定义filters
今天大家共同学习下ASP.NET MVC2.0中自定义filters,这一节主要学习下ActionFilterAttribute,
ActionFilterAttribute继承IActionFilter, IResultFilter接口,并且继承FilterAttribute类.
ActionFilterAttribute可以监控action执行过程中所有阶段,包括日志,异常处理等功能.
主要包括以下四个重载方法
OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted
1.OnActionExecuting是在action开始前执行
用于身份验证和服务器端缓存输出
2. OnActionExecuted在action结束后执行
主要用于异常处理
3. OnResultExecuting在返回result前执行
主要用于设置客户端缓存和服务器端压缩
4. OnResultExecuted在返回result后执行
主要用于异常处理和页面尾部输出调试信息
以下两个DEMO,将展示actionfilter的具体用法
demo1:
在这个DEMO中我们将展示action在各个阶段的执行时间,并在页面中输出。
首先我们定义一个ActionLogAttribute类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcAppOne.ActionFilters
- {
- publicclass ActionLogAttribute : ActionFilterAttribute
- {
- /// <summary>
- /// 表示actionID
- /// </summary>
- publicint ID
- {
- get;
- set;
- }
- /// <summary>
- /// 在 action开始前执行
- /// </summary>
- /// <param name="filterContext"></param>
- publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
- {
- filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon开始执行" + DateTime.Now.ToString() + "<br/>");
- base.OnActionExecuting(filterContext);
- }
- /// <summary>
- /// 在action结束后执行
- /// </summary>
- /// <param name="filterContext"></param>
- publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
- {
- filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon执行结束" + DateTime.Now.ToString() + "<br/>");
- base.OnActionExecuted(filterContext);
- }
- /// <summary>
- /// 在result开始前执行
- /// </summary>
- /// <param name="filterContext"></param>
- publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
- {
- filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行开始" + DateTime.Now.ToString() + "<br/>");
- base.OnResultExecuting(filterContext);
- }
- /// <summary>
- /// 在result结束后执行
- /// </summary>
- /// <param name="filterContext"></param>
- publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
- {
- filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "<br/>");
- base.OnResultExecuted(filterContext);
- }
- }
- }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcAppOne.ActionFilters
{
public class ActionLogAttribute : ActionFilterAttribute
{
/// <summary>
/// 表示actionID
/// </summary>
public int ID
{
get;
set;
}
/// <summary>
/// 在 action开始前执行
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon开始执行" + DateTime.Now.ToString() + "<br/>");
base.OnActionExecuting(filterContext);
} /// <summary>
/// 在action结束后执行
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon执行结束" + DateTime.Now.ToString() + "<br/>");
base.OnActionExecuted(filterContext);
} /// <summary>
/// 在result开始前执行
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行开始" + DateTime.Now.ToString() + "<br/>");
base.OnResultExecuting(filterContext);
} /// <summary>
/// 在result结束后执行
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "<br/>");
base.OnResultExecuted(filterContext);
} }
}
然后我们建立一个VIEW页面,ShowNews页面
然后再建立一个ACTION,并把属性标记在action上面
- [ActionFilters.ActionLog(ID=3)]
- public ActionResult ShowNews()
- {
- return View();
- }
[ActionFilters.ActionLog(ID=3)]
public ActionResult ShowNews()
{
return View();
}
此时我们运行ShowNews页面,我们将看到如下效果

demo2: 接着我们看第二个DEMO,在这个demo中,我们将展现actionFILTER中各个方法的作用
我们建一个类 ActionDealAttribute
- publicclass ActionDealAttribute : ActionFilterAttribute
- {
- publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
- {
- //用户没有验证通过,转向登录页面
- if (!filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
- {
- filterContext.Result = new RedirectResult("../account/logon");
- }
- }
- publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
- {
- //异常处理
- if (filterContext.Exception!=null)
- {
- filterContext.ExceptionHandled=true;
- filterContext.Result = new RedirectResult("../shared/Error");//转向错误页面
- }
- }
- publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
- {
- base.OnResultExecuting(filterContext);
- }
- publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
- {
- base.OnResultExecuted(filterContext);
- }
- }
public class ActionDealAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//用户没有验证通过,转向登录页面
if (!filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult("../account/logon");
}
} public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//异常处理
if (filterContext.Exception!=null)
{
filterContext.ExceptionHandled=true;
filterContext.Result = new RedirectResult("../shared/Error");//转向错误页面
} } public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
} }
再建立一个news页面,并建立一个对应的action
如果访问news页面需要登录才能访问,就在news对应的action标记此属性,在OnActionExecuting中进行处理
- [ActionFilters.ActionDeal]
- public ActionResult News()
- {
- return View();
- }
[ActionFilters.ActionDeal]
public ActionResult News()
{
return View();
}
如果news页面访问的时候出现异常,就会转向错误页面,在OnActionExecuted中进行处理
- [ActionFilters.ActionDeal]
- publicvoid News()
- {
- thrownew Exception();
- }
[ActionFilters.ActionDeal]
public void News()
{
throw new Exception();
}
以上只是自定义action的简单用法,供大家参考。
代码下载:http://download.csdn.net/detail/zx13525079024/4375094
ASP.NET MVC2.0 自定义filters的更多相关文章
- ASP.NET MVC2.0学习笔记:路由设置
Route设置 在 <Professional in ASP.NET MVC2.0>一书的第四章,主要讲述了Route的简单设置.格式化设置.约束设置.区域路由.匹配文件.路由调试以及对R ...
- Asp.Net MVC2.0 Url 路由入门---实例篇
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- Asp.Net MVC2.0 Url 路由入门---实例篇 【转】
本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...
- IIS 6.0上部署ASP.NET MVC2.0
在IIS7.5及8.0上部署都没有成功,对于身份验证会出现问题,据说是要安装什么东西,在这里说下IIS6.0的配置吧,下面是使用.net 4.0,自己可以选择所需的版本. 再此之前先确定web是用到了 ...
- 在iis上部署asp.net mvc2.0
mvc2.0是vs2010自带的,在开发环境下可以直接部署在iis中.在生产环境下,如果不能找到正确的mvc2.0版本,可以直接把开发环境下的System.Web.Mvc.dll拷贝过去使用. 1, ...
- asp.net MVC2.0学习笔记
asp.net;与mvc都是不可替代的:只是多一种选择:(解决了许多asp.net的许多缺点) model:充血模型.领域模型:很大程度的封装: 控制器:处理用户的交互,处理业务逻辑的调用,指定具体的 ...
- Asp.net MVC4.0自定义Html辅助方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》
[ASP.NET MVC2 系列] [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序> ...
- 经典ASP.NET MVC3.0入门详解
http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显 ...
随机推荐
- 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)
原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) [索引页] [源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.R ...
- 交换A与B值的四种方法
在网上看到了这样一道面试题,"int A=5,int B=2,怎样交换A与B的值",或许这是一道简单到不能再简单的题,但能作为一道面试题,肯定有其独特之处 大多数人会通过定义第三个 ...
- Apple Swift编程语言入门
1 简单介绍 今天凌晨Apple刚刚公布了Swift编程语言,本文从其公布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS&a ...
- Unity3D 表对象分类中的实现(C#)
// Sort by distance in descending order private void SortTargetsByDistance () { targets.Sort(delegat ...
- ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性 深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开 ...
- GitLab版本管理(转)
GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码,管理 ...
- JavaScipt面向对象编程----闭包
在javascript中闭包是一个非常不好理解的概念,可是确实一个不可逃避的东西,那么今天我们就来一起学习一下闭包. 什么是闭包? 闭包:官方"的解释是:闭包是一个拥有很多变量和绑定了这些变 ...
- Jvascript方法
Jvascript实用方法 这篇我主要记录一些在工作中常用的.实用的方法. String trim 字符串方法中的trim主要用来去空格使用,很多时候,在后台做参数处理的时候,我们都会使用该方法, ...
- BigPipe设计原理
高性能页面加载技术--BigPipe设计原理及Java简单实现 1.技术背景 动态web网站的历史可以追溯到万维网初期,相比于静态网站,动态网站提供了强大的可交互功能.经过几十年的发展,动态网站在互动 ...
- cocos2d-x lua 学习笔记(1) -- 环境结构
Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...