MVC过滤器使用方法

摘要:
首先,什么是过滤器:ASP NETMVC中的每个请求都将分配给相应的控制器和相应的行为方法进行处理。如果您想在这些处理前后添加一些额外的逻辑处理,您将使用过滤器。MVC支持四种类型的过滤器:授权、操作、结果和异常。默认情况下,将实现以下筛选器:1.授权筛选器将添加到“索引”页面。只有当用户名为admin1和admin,密码为123456时,才能访问索引页。protectedActionFilterAttribute();////Summary://Called由ASP。NET MVC框架的操作方法执行之后。

先介绍下什么是过滤器:ASP.NET MVC中的灭一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理,这时就用到了过滤器。

MVC支持的过滤器有四种:Authorization(授权)、Action(行为)、Result(结果)、Exception(异常)

MVC过滤器使用方法第1张

默认实现的过滤器如下:

MVC过滤器使用方法第2张

一、授权过滤器

给Index页面,添加授权过滤器,只有当用户名为admin1和admin,密码是123456时,才可以访问index页面。

1.无参数的授权过滤器

        [Authorize]
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Login(LoginModel login)
        {
            if ((login.UserName == "admin1" || login.UserName == "admin") && login.Password == "123456")
            {
                FormsAuthentication.SetAuthCookie(login.UserName, false);

                return Redirect("/Home/Index");
            }

            return View();
        }

此时,我们执行捷星程序,会发现报出无授权的错误,如下

MVC过滤器使用方法第3张

这是由于Web.Config 中缺少如下代码:

<authentication mode="Forms">
      <forms loginUrl="~/Home/Login" timeout="1"/>
</authentication>

此时,再次执行则会跳转至登录界面。

MVC过滤器使用方法第4张

2.有参数的授权过滤器

[Authorize(Users = "admin,admin1")],可以实现和上面无参相同的功能

[Authorize(Users = "admin")],此时,只有UserName为amin时,才会跳转至index页面。

二、HandleError过滤器

1、MVC默认错误页面

定义一个界面抛出异常,此时会进去MVC默认的错误页面,即Views/Shared下的Error.cshtml

        //处理错误过滤器HandleError
        [HandleError(ExceptionType = typeof(Exception))]
        public ActionResult ThrowError()
        {
            throw new Exception("this is ThrowErrorLogin Action Throw");
        }

执行结果如下:

MVC过滤器使用方法第5张

2、自定义错误页面

自定义一个错误页面MyError.cshtml

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>MyErrorPage</title>
</head>
<body>
    <div>
        <p>
            There was a <b>@Model.Exception.GetType().Name</b>
            while rendering <b>@Model.ControllerName</b>'s
            <b>@Model.ActionName</b> action.
        </p>
        <p style="color:Red">
            <b>@Model.Exception.Message</b>
        </p>
        <p>Stack trace:</p>
        <pre style=" background-color:Orange">@Model.Exception.StackTrace</pre>
    </div>
</body>
</html>

此时在方法前加上[HandleError(ExceptionType = typeof(Exception), View = "MyError")],则调用抛出异常的界面,则会跳转至我们自定义的错误界面

MVC过滤器使用方法第6张

三、自定义过滤器

自定义过滤器需要继承ActionFilterAttribute抽象类,重写其中的方法。

public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
        //
        // 摘要:
        //     初始化 System.Web.Mvc.ActionFilterAttribute 类的新实例。
        protected ActionFilterAttribute();

        //
        // 摘要:
        //     在执行操作方法后由 ASP.NET MVC 框架调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        public virtual void OnActionExecuted(ActionExecutedContext filterContext);
        //
        // 摘要:
        //     在执行操作方法之前由 ASP.NET MVC 框架调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        public virtual void OnActionExecuting(ActionExecutingContext filterContext);
        //
        // 摘要:
        //     在执行操作结果后由 ASP.NET MVC 框架调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        public virtual void OnResultExecuted(ResultExecutedContext filterContext);
        //
        // 摘要:
        //     在执行操作结果之前由 ASP.NET MVC 框架调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        public virtual void OnResultExecuting(ResultExecutingContext filterContext);
    }

1、不带参数的自定义过滤器

这里定义一个自定义的登录过滤器,用户名和密码为空,或者不为damin和123456,则会跳转至登录页面

public class CheckLogin: ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpCookieCollection CookieCollect = System.Web.HttpContext.Current.Request.Cookies;
            if (CookieCollect["username"] == null || CookieCollect["password"] == null)
            {
                filterContext.Result = new RedirectResult("/Home/Login");
            }
            else
            {
                if (CookieCollect["username"].Value != "admin" && CookieCollect["password"].Value != "123456")
                {
                    filterContext.Result = new RedirectResult("/Home/Login");
                }
               
            }
        }
    }

使用时只需要在方法名前加上[CheckLogin]即可。

2、带参数的自定义过滤器

public class ParamsFilter : ActionFilterAttribute
    {
        public string Message { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
            filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);
            filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
        }
    }

这个自定一过滤器定义了一个string类型的参数,使用时在Action上加[ParamsFilter(Message = "test")]

MVC过滤器使用方法第7张

四、如果一个Control中所有的Action都需要用到同一个过滤器,则可以直接在Control上面加此过滤器

免责声明:文章转载自《MVC过滤器使用方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle11g客户端client的下载与安装vscode php 代码提示 自动完成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

快速打造 react 后台管理系统

前言我相信许多小伙伴可能会满足开发后台管理系统的要求,那么我们如何快速完成这一要求?本文将记录以React为起点创建基本管理系统模板的过程,以加深对React技术堆栈和项目实践的理解。我希望开发这样的项目对每个人都有帮助。如果文章中有错误和错误,也请看小伙伴的评论。提前感谢您的项目介绍。React admin是基于R快速创建React应用脚手架而构建的...

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

docker run hangs问题排查记录

1.故障描述过去两天遇到了一个非常奇怪的问题。现在完整的故障描述如下:1)首先,我的同事告诉我,K8S集群中的一个工作节点将其状态更改为NoReady,并且在节点kubelet_truntime的错误日志中发现了大量此类日志E060301:50:51.45511776268remote。go:332]ExecSync1f0e3ac13faf224129bc4...

ios 苹果和百度地图的相关使用

同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度,确实做一些地图相关的东西,非常有吸引力。只是实现了显示一个百度地图的view。百度地图使用的是Objective-C++,这意味这必须要有一个.mm文件。...

Activiti-个人任务

1.分配任务所有者1.1固定分配在业务流程建模期间指定固定任务所有者;在properties视图中,填写Assignee项作为任务所有者;注:通过固定分配方法,任务是逐步执行的,任务负责人将根据bpmn的配置分配给每个任务;1.2表达式分配1.2.1 UEL表达式Activiti使用UEL表达式,UEL是javaEE6...

H3C 12508 收集诊断信息

案例:H3C12508单板卡出现remove状态,需要配合研发收集诊断信息。)总体:12500交换机返回三种文件----故障时诊断信息,主备单板的日志文件,主备单板的诊断日志操作步骤:一、故障时诊断信息:disdiagnostic-informationdiag收集必须在问题出现的时候,单板重起之前执行。在save时请选择Y保存到CF卡方式。一般情况下,此命...