zoukankan      html  css  js  c++  java
  • 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之后执行一些操作,相应的函数为OnActionExecutingOnActionExecuted。参见(http://yandavid.blog.163.com/blog/static/10779084201042195448379/)。好了先贴下代码再做说明:

      

    View Code
     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类也只是做了简单的定义如下,如果读者需要大可在其中大做文章

    View Code
     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的函数,我们可以通过继承和重写设计出适合自己项目需要的用于例如权限控制等的过滤器。

  • 相关阅读:
    cors允许的方法和contype-type
    解决Ubuntu 18.04中文输入法的问题
    "Visual Studio Code is unable to watch for file changes in this large workspace"
    设置spacevim字体显示乱码问题
    python3.6 +tkinter GUI编程 实现界面化的文本处理工具
    Python3.6的组件numpy的安装
    LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符
    SharpGL学习笔记(十九) 摄像机漫游
    SharpGL学习笔记(十八) 解析3ds模型并显示
    SharpGL学习笔记(十七) 立体文字和平面文字
  • 原文地址:https://www.cnblogs.com/biyeqingfeng/p/2154761.html
Copyright © 2011-2022 走看看