文章教程

18.5过滤器

8/31/2020 9:52:39 PM 人评论 次浏览

18.5 过滤器

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

在ASP.NET MVC应用程序中,控制器定义的行为方法都和可能的用户交互(单击一个链接或提交一个表单等)具有一对一的关系。例如,当用户单击一个链接,一个请求被路由到指定的控制器,相应的行为方法就会被调用。

然而,有时可能需要在调用行为方法之前或之后执行逻辑操作。为了支持这样的操作, ASP.NET MVC提供了过滤器,过滤器提供了一种向控制器行为方法中添加前行为(Pre-action)和后行为(Post-action)的方法。

过滤器是ASP.NET MVC中一个非常有用的扩展,它最初是在Prevew 2版本中出现的,允许在对MVC控制器的请求中注入拦截代码,这些代码在Controller和它的Action方法执行的前后执行,这样就可以以一种非常干净、声明的方式轻松地封装和重用功能。过滤器继承自ActionFilterAttribute的类。可以通过过滤器特性来标记任何行为方法或控制器以表明过滤器应用于该方法或该控制器内的所有方法。

ASP.NET MVC提供了4种类型的过滤器:

● 授权(Authorize),该过滤器用来限制进入控制器或控制器行为。

● 处理错误(HandleError),该过滤器用来指定一个行为,这个行为用来处理某个行为方法中抛出的异常。

● 缓存输出(OutputCache),该过滤器用来为行为方法提供输出缓存。

● 自定义过滤器,自定义过滤器允许开发人员自己创建行为过滤器以执行所需要的功能。比如自定义的过滤器包括日志、权限、本地化以及认证功能。

18.5.1 Authorize过滤器

很多Web应用程序要求用户在使用限制内容之前必须先进行登录。为了限制进入某个ASP.NET MVC视图,可以限制对渲染该视图的行为方法的进入。ASP.NET MVC提供的Authorize过滤器特性可是实现这个功能。

当使用Authorize特性标记一个行为方法时候,该方法的进入就被限制为被认证和被授权的用户。如果一个控制器被Authorize过滤器特性所标记,则该控制器内所有行为方法的访问都具有限制性。

Authorize特性让开发人员指明行为方法被限制于那些预定义的角色或用户,这样程序员就具有了允许用户查看网站内页面的最大控制权限。

如果一个未被授权的用户试图进入被Authorize特性标记的行为方法,MVC框架就会抛出401 HTTP状态码。如果网站被配置为使用ASP.NET表单认证,401状态码将会把用户导航到登录页面。

Authorize过滤器的实现依赖于AuthorizeAttribute类。该类设置了二个属性,分别是Users和Roles,分别表示成员的用户名和角色。通过对这二个属性的控制完成成员和角色的验证功能。

【实例18-7】使用Authorize过滤器

本实例使用Authorize过滤器完成指定页面的成员管理功能,不是注册的用户无法登录访问该页面,具体实现步骤如下:

01 启动Visual Studio 2012,创建一个ASP.NET MVC 4 Web应用程序,命名为“实例18-7”。

02 双击程序中Controller文件夹下的HomeController控制器文件,并添加以下代码:

alt

上面的代码中第1行使用[Authorize]属性实现对访问视图的用户验证。第2行添加了一个动作方法Authorize对应于视图页面Authorize.cshtml。如果运行该页面,由于[Authorize]属性设置在Authorize的方法上,所以Authorize.cshtml只有注册用户可以,登录后才可以访问,因此网站将转移到登录页面。

03 选择Authorize方法,然后单击鼠标右键,在弹出的快捷菜单中选择“添加视图”命令。打开“添加视图”对话框,在“视图引擎”下拉列表中选择Razor(CSHTML)选项;然后选中“选择母版页”多选按钮,在下面的文本框中输入母版页的路径;最后单击“添加”按钮。ASP.NET MVC 4就会自动的在网站根目录Views文件夹下的Home子文件夹下创建一个Authorize.cshtml页面。

04 单击打开Authorize. Cshtml页面,在文件中编写如下代码:

alt

上面的代码中第2行设置页面标题,母版页的路径。第5行通过ViewBag数据字典在视图中接受控制器中传递Message属性的值。

05 单击程序中Shared文件夹下的_Layout.cshtml母版页文件,添加以下代码,在页面菜单栏项中添加一个用于运行Authorize.cshtml页面的“验证”链接。

alt

06 按Ctrl+F5快捷键,运行程序,进入首页后,单击“验证”链接,会发现无法进入该页面,而是转到了如图18-23所示的Login. cshtml登录页面。

alt

图18-23 登录页面

07 因为还不是注册用户,所以要单击“注册”链接。进入如图18-24所示的注册页面,输入注册信息后,单击“注册”按钮。

alt

图18-24 注册页面

08 当完成注册,成员用户后,会进入项目的首页。此时再单击“验证”链接,就可以进入如图18-25所示的Authorize. cshtml页面。

alt

图18-25 验证页面

上面需要验证的Authorize.aspx页面,任何注册用户均可以登录后访问,如果需要只有指定的用户名才能访问,可以设置如下的Authorize属性。

alt

上面的代码中User参数可以设置一个或多个的已注册用户名,只有这些用户才能登录后访问需要验证的页面。

如果需要指定的用户名太多,可以将这些用户设置为一类角色,通过如下的角色参数来设置。

alt

上面的代码中,Roles参数可以设置一个或多个已注册的角色名,只有属于这些角色的注册用户才能登录访问需要验证的页面。

18.5.2 OutputCache过滤器

OutputCache过滤器实现的主要功能是借用了ASP.NET中的页面缓存机制,实现ASP.NET MVC网站中指定页面的缓存,从而提高网站的性能。

一般来说,在控制器或者控制器内的行为方法上,设置[OutputCache]属性,以便在该属性中指定相关的缓存参数;还可以在视图页面中直接设置缓存参数;或者在Web.config配置文件中设置相关的缓存参数。

OutputCach过滤器的实现是通过OutputCachAttribute类,该类中有多个属性,这些属性的使用说明如表18-9所示。

表18-9 OutputCachAttribute类的属性

alt

【实例18-8】使用OutputCach过滤器

本实例使用OutputCache过滤器实现视图页面的缓存功能,具体实现步骤如下:

01 启动Visual Studio 2012,创建一个使用ASPX视图引擎的ASP.NET MVC 4 Web应用程序,命名为“实例18-8”。

02 单击打开项目中Controller文件夹下的HomeController控制器文件并添加以下代码:

alt

上面的代码中第1行添加了一个OutputCache动作方法。第2行通过ViewData字典属性Message储存了系统当前时间。

03 选择OutputCache方法,单击鼠标右键,在弹出的快捷菜单中选择“添加视图”命令。打开“添加视图”对话框,在“视图引擎”下拉列表中选择ASPX(C#);选中“选择母版页”多选按钮,在下面的文本框中输入母版页的路径,最后单击“添加”按钮。ASP.NET MVC 4就会自动的在网站根目录Views文件夹下的Home子文件夹下创建一个OutputCache.aspx页面。

04 单击打开OutputCache.cshtml文件,在代码中编写关键代码如下。

alt

上面的代码中第5行通过ViewData数据字典在视图中接受控制器中传递的值。

05 双击程序中Shared文件夹下的Site.Master母版页文件,添加以下代码,在页面菜单栏项中添加一个用于运行OutputCache页面的“缓存”链接:

alt

06 按Ctrl+F5快捷键,运行程序,进入首页后,单击“缓存”链接,进入OutputCache.aspx页面显示如图18-26的效果。如果用户多次单击浏览器的“刷新”按钮,则系统的当前时间将会不断地更新。

alt

图18-26 运行结果

07 在HomeController控制器中的OutputCache动作方法上添加如下一行代码:

alt

以上代码在动作方法OutputCache上设置[OutputCache]属性,使得OutputCache.aspx页面具有缓存功能,指定属性Duration的值为10s,属性VaryByParam的值为none。

08 通过首页再次进入OutputCache.aspx页面,此时如果单击浏览器中的“刷新”按钮,则系统的当前时间将不会马上更新。因为OutputCache.aspx页面被设置为缓存10s,10s后,如果再单击浏览器中的“刷新”按钮,系统时间才会被更新。

09 还可以直接在OutputCache.aspx页面设置缓存,双击打开OutputCache.aspx文件,在@Page指令下面添加如下代码:

alt

以上代码通过@OutputCache指令设置该页面OutputCache属性,使得该页面也具有了缓存的功能。

为了方便开发人员修改缓存特性中的相关属性参数,可以在配置文件Web.config中的<outputCacheProfiles></outputCacheProfiles>节点设置如下代码:

alt

上面的代码中,第1行和第8行的<caching>和</caching>节点必须位于Web.config文件的<system.web>和</system.web>节点之中。在第3行~第5行设置缓存。其中第4行设置缓存的名称OutputCache、输出缓存的时间10和没有缓存参数。这样在控制器或者相关的缓存页面中,就可以通过outputCacheProfile属性直接引用了。

在OutputCache.aspx视图页面@Page指令下面添加如下代码:

alt

以上代码仍然通过OutputCache属性直接在页面中设置缓存,但是通过设置CacheProfile属性,引用了配置文件中名称为OutputCache的缓存,便于开发人员在配置文件中修改缓存参数,不需要重新编译页面或控制器,可以提高网站的性能。

18.5.3 HandleError过滤器

通过ASP.NET MVC应用程序中的HandleError过滤器可以指定如何处理行为方法中抛出的异常。默认情况下,如果一个被标记了HandleError属性的行为方法抛出任何异常,MVC框架都会显示应用程序目录下View文件夹的Shared文件夹内的Error.aspx或Error.cshtml视图。

HandleError过滤器是通过HandleErrorAttribute类实现的,该类提供了如下几个属性:

● ExceptionType,指定过滤器要处理的异常类型。如果该属性未被指定,则过滤器处理所有的异常。

● View,指定要显示的视图名称。

● Master,指定要使用的母版视图名称。

● Order,指定过滤器被应用的顺序。

其中,Order属性用来决定用哪个HandleError过滤器来处理一个异常。可以把Order属性设置为整数值以指定优先级,整数值的范围是从-1开始到任何正整数,整数值越高优先级越低,属性Order遵循如下规则:

● 应用于控制器的过滤器自动应用于控制器的每个方法。

● 当应用于控制器的过滤器与应用于行为方法的过滤器具有相同的Order值时,应用于控制器的过滤器优先级高。

● 如果没有指定Order值,默认为-1,这就意味着该过滤器比其他Order值不是-1的过滤器具有较高的优先级。

● 错误处理停止后,第一个HandleError过滤器就会被调用。

【实例18-9】使用HandleError过滤器

本实例使用HandleError过滤器实现处理控制器动作方法的异常情况,具体实现的步骤如下所示:

01 启动Visual Studio 2012,创建一个ASP.NET MVC 4 Web应用程序,命名为“实例18-9”。

02 双击打开项目中Controller文件夹下的HomeController控制器文件并添加以下代码:

alt

在上面的代码中,第1行添加了一个HandleError的动作方法。第2行人为抛出一个运行出现的异常。

03 选择HandleError方法,然后单击鼠标右键,在弹出的快捷菜单中选择“添加视图”命令。打开“添加视图”对话框,在“视图引擎”下拉列表中选择Razor(CSHTML);选中“选择母版页”多选按钮,在下面的文本框中输入母版页的路径;最后单击“添加”按钮。ASP.NET MVC 4就会自动的在网站根目录Views文件夹下的Home子文件夹下创建一个HandleError.cshtml页面。

04 双击程序中Shared文件夹下的_Layout.cshtml母版页文件,添加以下代码,在页面菜单栏项中添加一个用于运行HandleError页面的“处理异常”链接:

alt

05 按Ctrl+F5快捷键运行程序,进入首页后,单击“处理异常”链接,由于在执行动作方法HandleError中抛出了异常,将会显示如图18-27所示的页面。

alt

图18-27 HandleError页面运行结果

06 以上的运行结果对用户来说感觉会很不友好,所以有必要做一些处理。在HomeController控制器中的HandleError动作方法上添加如下代码:

alt

这行代码使用[HandleError]属性设置了动作方法HandleError的异常处理页面为Share目录下的个性化异常处理页面Error.cshtml。

07 在配置文件Web.config中的<system.web>和</system.web>节点之中,添加如下代码:

alt

以上代码将异常处理的模式设置为自定义。

08 通过首页再次进入HandleError.cshtml页面,此时就会打开如图18-28所示的人性化异常处理页面Error.cshtml。

alt

图18-28 出现异常的运行结果

教程类别