MVC中关于Action过滤器小结
今天看了下MVC的Nerdinner案例,发觉写这种文档的时候作者并没有涉及到如何设计自定义的过滤器,而是着重在建立相互之间的逻辑关系上,于是倍觉不爽,谷哥摆渡之,发现网上有一些不错的关于自定义过滤器的文摘,其中:http://hi.baidu.com/itbase/blog/item/4d2bfbdd62a9b8fa76c63888.html一文介绍了如何重写原有的Authorize,建立自定义的过滤器。让我倍受启发的是Anytao大牛的这篇文章,http://kb.cnblogs.com/page/53772/ .其实所谓的action过滤器也只是一种比较特殊的类罢了,我们可以通过继承重写原有的Authorize类的 AuthorizeCore,这是一种比较取巧的方式,也可以彻底颠覆原有,写自己的过滤器让别人去说,这样自由度更大,像在用户权限控制等方面都是需要这种过滤器对action进行过滤的。
下面不妨从一个实例开始一步步认识ActionFilter吧,我主要参考了Anytao大牛的文章,自己写了个很简单的测试程序,是在Nerinner上做的,比较水,但是基本能够说明问题:
我继承了ActionFilterAttribute类,关于此类的说明网上有许多的资料,它能够在调用action和action之后执行一些操作,相应的函数为OnActionExecuting和OnActionExecuted。参见(http://yandavid.blog.163.com/blog/static/10779084201042195448379/)。好了先贴下代码再做说明:
1 using System;
2
3 using System.Collections;
4
5 using System.Collections.Generic;
6
7 using System.Linq;
8
9 using System.Web;
10
11 using System.Web.Mvc;
12
13 using System.Net;
14
15 using System.Net.Sockets;
16
17 using System.ComponentModel;
18
19 using System.Data;
20
21
22 namespace School.Models.MyAutorize //自定义过滤器
23
24 {
25
26 public class MyAuthAttribute : ActionFilterAttribute
27
28 {
29
30
31 public string name_value;
32
33 protected bool isauthorized = false;
34
35
36 public override void OnActionExecuting(ActionExecutingContext filterContext)
37
38 {
39
40 if (filterContext.ActionParameters.ContainsKey(name_value)) //如果含有过滤器中含有name字段
41
42 {
43
44 //获取用户名
45
46
47
48 674260588 16:30:06:
49
50 string value = filterContext.ActionParameters[name_value].ToString();
51
52 if (new IsAutorized().IsDinnerAuthorized(value) == true) isauthorized = true;
53
54 else isauthorized = false; //是否通过认证
55
56 }
57
58 else isauthorized = false;
59
60 if (isauthorized==true)
61
62 {
63
64 base.OnActionExecuting(filterContext); //如果认证通过则继续执行
65
66 }
67
68 else
69
70 {
71
72 filterContext.Result = new ViewResult
73
74 {
75
76 ViewName = "LogOn" //否则回到Logon的界面
77
78 };
79
80 //base.OnActionExecuting(filterContext);
81
82 }
83
84 }
85
86 }
87
88 }
其中Isuthorized类也只是做了简单的定义如下,如果读者需要大可在其中大做文章
1 using System;
2
3 using System.Collections.Generic;
4
5 using System.Linq;
6
7 using System.Web;
8
9
10 namespace School.Models.MyAutorize
11
12 {
13
14 public class IsAutorized
15
16 {
17
18 public bool IsDinnerAuthorized(string name) //自定义审核是否通过认证
19
20 {
21
22 if(name=="1") return true;
23
24 else return false;
25
26 }
27
28 }
29
30 }
通过这样的限制,结果是我们如果想要访问/Dinner/Edit/1是允许的,当访问其他id的url时,都会不被允许而直接跳转到Logon的界面。
其实MVC已经为我们留好了丰富的自定义filter的函数,我们可以通过继承和重写设计出适合自己项目需要的用于例如权限控制等的过滤器。