自定义的action过滤器  需要继承自ActionFilterAttribute 接口

OnActionExecuting:  在方法执行之前执行

OnActionExecuted:  方法的逻辑代码执行完成之后触发

OnResultExecuting: 方法在准备放回结果的时候触发

OnResultExecuted:方法返回结果之后触发

    /// <summary>
/// 自定义的action过滤器 和result过滤器
/// </summary>
public class ActionFilterDemo : ActionFilterAttribute
{
/// <summary>
/// 在方法执行之前被触发
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//判断如果在控制器上贴有SkipAttribute特性标签则跳过下面代码的执行
if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipAttribute), false))
{
return;
} filterContext.HttpContext.Response.Write("1 、OnActionExecuting----<br />"); //1.0 获取触发当前方法的action名称
var actionName = filterContext.ActionDescriptor.ActionName; //2.0 获取action方法所在的控制器
var cName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
filterContext.HttpContext.Response.Write(" 1.1 、控制器+action=" + cName + actionName + "<br />"); //3.0 获取action的参数
string res = "无参数";
var prmas = filterContext.ActionParameters;
if (prmas != null && prmas.Any())
{
res = "";
//打印参数名称和值
foreach (var ps in prmas)
{
res += "参数名称=" + ps.Key + ",参数值=" + ps.Value + " | ";
}
}
filterContext.HttpContext.Response.Write(" 1.2 、参数结果:" + res + "<br />"); //4.0 获取当前action上的指定的特性标签HttpGet
object[] atts = filterContext.ActionDescriptor.GetCustomAttributes(typeof(HttpGetAttribute), false);
var allAtts = filterContext.ActionDescriptor.GetCustomAttributes(false);//获取所有的特性标签 //4.0.1 判断当前action方法上是否贴有HttpGet的特性标签
bool isok = filterContext.ActionDescriptor.IsDefined(typeof(HttpGetAttribute), false); //5.0 获取当前aciton所在的控制器上的特性标签和判断特性标签
var allcatts = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(false);
var isOK1 = filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(HttpGetAttribute), false); //6.0 其实OnActionExecuting是在方法执行之前执行的 那么当然也可以用来改造验证同意登陆啦 下面是我自己的尝试 //获取当前登录url 登陆完毕需要跳转回来的
bool isLogin=false; //根据项目的登陆方式判断是否登陆
if (!isLogin)
{
string call_back = System.Web.HttpContext.Current.Request.Url.ToString();
ContentResult result = new ContentResult();
result.Content = "<script>alert('请先登录');window.location.href='http://www.xxoo.com/Passport/Login?callback_url=" + call_back + "'</script>";
filterContext.Result = result;
return;
}
base.OnActionExecuting(filterContext);
} /// <summary>
/// 方法逻辑代码执行以后被触发
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("3 、OnActionExecuted----<br />");
base.OnActionExecuted(filterContext);
} /// <summary>
/// 方法准备返回结果的时候被触发
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("4 、OnResultExecuting----<br />");
base.OnResultExecuting(filterContext);
} /// <summary>
/// 方法返回结果后被触发
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("6 、OnResultExecuted----<br />");
base.OnResultExecuted(filterContext);
}
}

自定义异常过滤器 继承自HandleErrorAttribute接口

OnException: 该接口 用户不扣action中没有被try{} catch包括的异常

/// <summary>
/// 作用:用于捕获action中的未被try{}catch{}捕获的异常
/// </summary>
public class ExpAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{ //1.0获取异常信息
Exception exp = filterContext.Exception; //2.0 将信息写入日志或者db中方便查询
// System.IO.File.AppendAllText(filterContext.HttpContext.Server.MapPath("/Log/log.txt"), exp.ToString()); //3.0 通知MVC框架,现在这个异常已经被我处理掉,你不需要将黄页显示给用户
filterContext.ExceptionHandled = false; //4.0 跳转到错误提醒页面
//filterContext.Result
filterContext.HttpContext.Response.Redirect("/Error/Error", true); base.OnException(filterContext);
}
}

其实自定义错误页面还可以换个姿势

在Web.config中配置

<customErrors mode="Off" defaultRedirect="Error">       这里的Error页面是views/shared/Error.cshtml页面    
<!--<error statusCode="404" redirect="/Error/404" />-->  statusCode  定义的 是错误类型      这里的redirect    是自定义的错误页面
</customErrors>

------------------------------最后将过滤器注入到Global.asax文件中

public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); //将ActionFilterDemo 注册成为一个全局过滤器,实现当前网站中的任何action方法被执行的时候都
//会触发过滤器中的相关方法
filters.Add(new ActionFilterDemo());
filters.Add(new AuthAttribute()); filters.Add(new ExpAttribute());
}
}
 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);
}
}

MVC过滤器-->ActionFilterAttribute和HandleErrorAttribute的更多相关文章

  1. MVC 过滤器 ActionFilterAttribute

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. mvc过滤器学习(1)

    mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...

  3. ASP.NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

  4. MVC过滤器详解

    MVC过滤器详解   APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...

  5. ASP.NET MVC过滤器(一)

    MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...

  6. MVC过滤器详解和示例

    原文  http://blog.csdn.net/ankeyuan/article/details/29624005 MVC过滤器一共分为四个:ActionFilter(方法过滤器),ResultFi ...

  7. NET MVC过滤器

    NET MVC过滤器 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在ASP.NET MVC中有四种过滤器类型

  8. MVC过滤器简单理解

    之前对于MVC过滤器的理解一直处于很模糊的状态,就在网上找了一些很简单的案例做了一下学习,就找了一个比较容易理解的demo分享给大家. 新建一个MVC4项目,可以在global.asax文件中看到如下 ...

  9. ASP.NET MVC 过滤器(五)

    ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...

随机推荐

  1. IIS日志如何记录X-Forwarded-For

    起因 最近因为某个站点的流量异常,需要统计一下服务器的来源IP,本来开一下IIS日志就能搞定的事儿,但不幸的是生产服务器使用F5做了负载均衡,IIS日志无法记录到真实IP,真实的IP在"x- ...

  2. ssh远程连接控制 linux 口令、密钥连接

    sshd服务提供两种安全验证的方法: 基于口令的安全验证:经过验证帐号与密码即可登陆到远程主机. 基于密钥的安全验证:需要在本地生成“密钥对”后将公钥传送至服务端,进行公共密钥的比较(相对安全). 首 ...

  3. 20140904 atoi字符串转化为整数源码

    1.atoi源码 #include<stdio.h> #include<assert.h> bool isdigit1(char c) { ') return true; el ...

  4. JavaScript之 ------ 函数(一般函数、动态函数、匿名函数)

    JavaScript之 ------ 函数(一般函数.动态函数.匿名函数) 函数 一.一般函数 1.格式: function 函数名(形式参数...) { 执行语句: return 返回值: } 函数 ...

  5. swoole安装异步reids

    /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-async ...

  6. Sql Server 表结构相关

    1.库表列信息 --取所有库 SELECT Name FROM Master..SysDatabases ORDER BY Name --查询所有表 select name from 库名..syso ...

  7. Msys2升级后不能编译

    Msys2升级后不能编译 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} cod ...

  8. MUI对话框使用

    一.alert告警框 用法 .alert(message,title,btnvalue,callback[,type]); document.getElementById("noclick& ...

  9. Pyhton第八节 字典补充

    Python 字典的基本元素是键值对(key-value), 每个键值对的key和value之间用:分割:每个键值对之间用,分割:整个键值对用花括号{}包围 字典内的键(key)必须唯一,值不需要唯一 ...

  10. 解决 使用migrations 执行update-database 出现System.InvalidOperationException: 实例失败的问题

    好久没有使用Code First的方式来创建模型了  今天重温了一下 但是出现了很多问题 现在总结一下 在我做完初期的操作的之后,使用 update-database -verbose 更新数据库时, ...