ASP.NET MVC 中给我们提供了内置的过滤器,通过过滤器,我们可以在控制器内的方法前后,添加必须的业务逻辑,如权限验证,身份验证,错误处理等。

今天,我们主要介绍3个过滤器:OutputCacheAttribute,AuthorizeAttribute,HandleErrorAttribute。

我们会根据这三个内置过滤器,分别举不同的例子进行解释说明。

1. OutputCacheAttribute

我们先看看源码:

可以看出OutputCacheAttribute继承了ActionFilterAttribute,所以可以重写ActionFilterAttribute的方法OnActionExecuting等,

类中有CacheProfile,Duration,VaryByParam几个属性,下面我们看一下用法。添加如下代码:

[OutputCache(Duration=)]
public ActionResult OutputCache()
{
ViewData["TimeCache"] = "当前时间是:" + DateTime.Now.ToLongTimeString();
return View();
}

打开浏览器,可以看到,不断刷新,每10秒就会更新一次:

当然,也可以写在页面上,在页面添加代码:

<%@ OutputCache Duration="10" VaryByParam="None" %>

如下面代码:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ OutputCache Duration="" VaryByParam="None" %>
<!DOCTYPE html> <html>
<head runat="server">
<meta name="viewport" content="width=device-width" />
<title>OutputCache</title>
</head>
<body>
<div>
<%=ViewData["TimeCache"] %>
</div>
</body>
</html>

或者使用CacheProfile,代码如下:

 [OutputCache(CacheProfile = "testProfile")]
public ActionResult OutputCache()
{
ViewData["TimeCache"] = "当前时间是:" + DateTime.Now.ToLongTimeString();
return View();
}

在web.config添加如下配置:

<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="testProfile" duration="" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>

2. AuthorizeAttribute

AuthorizeAttribute类的作用,主要是为页面指定操作用户和角色。

我们假设以Session作为页面管理权限,新建一个CustomAuthorize类,添加如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcMobileDMS.App_Start
{
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//假设以Session作为判断页面权限
if (filterContext.HttpContext.Session["temp"] == null)
{
filterContext.HttpContext.Response.Redirect("~/dms/logon");
}
base.OnAuthorization(filterContext); }
}
}

再在控制器中的方法添加如下代码:

[MvcMobileDMS.App_Start.CustomAuthorize]
public ActionResult Authorize()
{ return View();
}

即可进行权限检查。

3. HandleErrorAttribute

HandleErrorAttribute特性主要用于处理由操作引发的错误。在实际操作中我们可以继承HandleErrorAttribute类,并重写OnException方法来进行错误记录。

首先,我们新建一个错误页:

 public ActionResult error()
{
return View();
}
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<!DOCTYPE html>

<html>
<head runat="server">
<meta name="viewport" content="width=device-width" />
<title>error</title>
</head>
<body>
<div>
Sorry.an error occoured.
</div>
</body>
</html>

并添加错误处理类ErrorHandle继承自HandleErrorAttribute,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcMobileDMS.App_Start
{
public class ErrorHandle : HandleErrorAttribute
{
public override void OnException(ExceptionContext Context)
{
HttpContext.Current.Response.Redirect("~/dms/error");
base.OnException(Context);
}
}
}

在DMS控制器新增一个方法EceptionThrow,并加上过滤器ErrorHandle,代码如下:

[MvcMobileDMS.App_Start.ErrorHandle]
public ActionResult EceptionThrow()
{
throw new ArgumentNullException("filterContext");
}

下面,我们打开浏览器,输入地址:http://localhost:7449/dms/EceptionThrow,显示如下:

当EceptionThrow()方法抛出错误时,ErrorHandle过滤器触发OnException方法,跳转到error页面。

由此可见,我们可以通过HandleErrorAttribute过滤器,处理各种Exception,并使用自定义方法进行处理。

以上,希望能对您有所帮助O(∩_∩)O哈哈~

ASP.NET MVC 过滤器开发与使用的更多相关文章

  1. Asp.net Mvc模块化开发之分区扩展框架

    对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...

  2. Asp.net Mvc模块化开发系列(目录)

    模块化开发是非常重要的,模块化开发是个系统性问题,为此我觉得有必须要写一个系列的文章才能基本说的清楚 那又为什么要写一个目录呢? 其一.是对我昨天承诺写一个系列新的文章的回应 其二.是先写出一个大纲, ...

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

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  4. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

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

    ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...

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

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

  7. ASP.NET MVC 网站开发总结(三) ——图片截图上传

    本着简洁直接,我们就直奔主题吧,这里需要使用到一个网页在线截图插件imgareaselect(请自行下载). 前台页面: <!DOCTYPE html> <html> < ...

  8. ASP.NET MVC框架开发系列课程 (webcast视频下载)

    课程讲师: 赵劼 MSDN特邀讲师 赵劼(网名“老赵”.英文名“Jeffrey Zhao”,技术博客为http://jeffreyzhao.cnblogs.com),微软最有价值专家(ASP.NET ...

  9. 像asp.net Mvc一样开发nodejs+express Mvc站点

    像asp.net Mvc一样开发nodejs+express Mvc站点 首先,我是个c#码农.从事Mvc开发已然4个年头了,这两年前端MVC的兴起,我也跟风学了一些,对前端的框架也了解一些,angu ...

随机推荐

  1. android 手电筒的实现

    android手机用闪光灯做成手电筒的应用非常多,可是有的不能用. 后来发现是除了把 camera device的 flashmode设置成torch外还要打开预览: 以下是代码: MainActiv ...

  2. Codeforces Round #286 (Div. 1) D. Mr. Kitayuta's Colorful Graph 并查集

    D. Mr. Kitayuta's Colorful Graph Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/ ...

  3. Codeforces Round #326 (Div. 2) B. Duff in Love 分解质因数

    B. Duff in Love Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/588/proble ...

  4. 第十七章,txt文件的写入和读取数据结合练习(C++)

    #include <iostream> #include <fstream> int main(int argc, char** argv) { std::string str ...

  5. Android4.4 蓝牙源码部分分析

    最近GOOGLE发布了Android4.4,看了一下源码:4.4的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点 ...

  6. 给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大

    题目:给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i <= j)并且j-i最大 ,若有多个这样的位置对,返回i最小的那一对. 最直接的想法就是对于每一个 i 从数 ...

  7. redo log write和flush

    http://bbs.chinaunix.net/thread-1753130-1-1.html 在事务提交时innobase会调用ha_innodb.cc 中的innobase_commit,而in ...

  8. DDNS 的工作原理及其在 Linux 上的实现--转

    http://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/index.html DDNS (Dynamic DNS) 扩展了 DNS 将客 ...

  9. Yar - Yet Another RPC framework for PHP

    Introduction Yar is a RPC framework which aims to provide a simple and easy way to do communication ...

  10. QTP自学攻略

    QTP自学攻略 自学总是很痛苦的,看大量的书籍,可是学到的东西却不是那么实用,下面整理了一些在QTP中经常需要的函数,以及方法很实用!  QTP常用函数  1, 获取对话框相应的文字: GetVisi ...