- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章ASP.NET mvc4中的过滤器的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
mvc4中的过滤器 。
过滤器(Filter)把附加逻辑注入到MVC框架的请求处理。实现了交叉关注.
交叉关注:用于整个应用程序,又不适合放在某个局部位置的功能.
过滤器是.NET的注解属性(Attribute),它们对请求处理管道添加了额外的步骤.
注解属性是派生于System.Attribute的特殊的.NET类.
可以被附加到类、方法、属性、字段等代码元素上。其目的是把附加信息嵌入到已编译的代码中,以便在运行时读回这些信息.
过滤器的基本类型:
。
过滤器类型 。 |
接口 。 |
默认实现 。 |
描述 。 |
Authorization 。 |
IAuthorizationFilter 。 |
AuthorizationAttribute 。 |
最先运行 。 |
Action 。 |
IActionFilter 。 |
ActionFilterAttribute 。 |
在动作方法前后运行 。 |
Result 。 |
IResultFilter 。 |
ActionResultAttribute 。 |
在动作结果被执行前后 。 |
Exception 。 |
IExceptionFilter 。 |
HandlerErrorAttribute 。 |
仅在过滤器、动作发生异常时 。 |
。
授权过滤器:IAuthorizationFilter 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
namespace
System.Web.Mvc{
// 摘要:定义授权筛选器所需的方法。
public
interface
IAuthorizationFilter{
// 摘要:在需要授权时调用。
// 参数:filterContext:筛选器上下文。
void
OnAuthorization(AuthorizationContext filterContext);
}
}
|
注意:
直接实现接口其实是一件非常危险的事;因此创建一个自定义AuthorizeAttribute子类,再实现授权代码比较容易.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
class
CustomAuthAttribute:AuthorizeAttribute{
/// <summary>
/// 是否对请求进行授权访问的方式
/// </summary>
/// <param name="httpContext">对请求信息进行访问的方法</param>
protected
override
bool
AuthorizeCore(HttpContextBase httpContext){
return
base
.AuthorizeCore(httpContext);
}
}
|
直接实现IAuthorizationFilter接口的主要原因是为了获取对传递给OnAuthorization()的AuthorizationContext的访问,通过它可以获得更广泛的信息(路由细节、当前控制器和动作方法信息)。使用接口的方式不仅有安全风险且让授权注解属性中建立的逻辑与控制器紧密的耦合在一起,破坏关注分离,不便于维护.
内建的授权过滤器:
虽然使用了AuthorizeAttribute类作为自定义过滤器的基础,但其AuthorizeCore()有自己的实现 。
当直接使用AuthorizeAttribute时,可以使用它的public属性来指定授权策略 。
AuthorizeAttribute属性 。
。
名称 。 |
类型 。 |
描述 。 |
Users 。 |
String 。 |
一个逗号分隔的用户名列表,指定这些用户可以访问动作方法 。 |
Roles 。 |
String 。 |
一个逗号分隔的角色列表,用户必须至少有一个角色 。 |
。
1
2
3
4
5
6
7
8
9
10
11
|
public
class
HomeController : Controller{
[Authorize(Users =
"admin,steve,jacqui"
,Roles =
"admin"
)]
public
ActionResult Index(){
return
View();
}
}
|
异常过滤器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
namespace
System.Web.Mvc{
// 摘要:定义异常筛选器所需的方法。
public
interface
IExceptionFilter{
// 摘要:在发生异常时调用。
// 参数:filterContext:
// 筛选器上下文。
void
OnException(ExceptionContext filterContext);
}
}
|
当一个未处理的异常出现时,OnException()被调用。该方法的参数是一个ExceptionContext 对象,此对象派生于ControllerContext,并提供了许多有用的属性.
。
名称 。 |
类型 。 |
描述 。 |
Controller 。 |
ControllerBase 。 |
返回请求的控制器对象 。 |
HttpContext 。 |
HttpContextBase 。 |
提供对请求细节的访问及对响应的访问 。 |
IsChildAction 。 |
Bool 。 |
若是自动做则返回true 。 |
RequestContext 。 |
RequestContext 。 |
提供对HttpContext和路由数据的访问 。 |
RouteData 。 |
RouteData 。 |
返回请求的路由数据 。 |
。
继承自ControllerContext的属性 。
。
名称 。 |
类型 。 |
描述 。 |
ActionDescripter 。 |
ActionDescripter 。 |
提供动作方法的细节 。 |
Result 。 |
ActionResult 。 |
用于动作方法的结果,通过非空值可取消请求 。 |
Exception 。 |
Exception 。 |
未处理的异常 。 |
ExceptionHandled 。 |
Bool 。 |
如果另一个过滤器已经把这个异常标记为已处理则返回true 。 |
。
实现自定义异常过滤器 。
1
2
3
4
5
6
7
|
public
class
RangeExceptionAttribute : FilterAttribute, IExceptionFilter{
public
void
OnException(ExceptionContext filterContext){
}
}
|
使用内建的异常过滤器:
HandleErrorAttribute属性 。
。
名称 。 |
类型 。 |
描述 。 |
ExceptionType 。 |
Type 。 |
由过滤器处理的异常类型 。 |
View 。 |
String 。 |
该过滤器渲染的视图模板名 。 |
Master 。 |
String 。 |
在渲染这个过滤器的视图时使用的布局名称 。 |
。
准备工作:
在web.config文件中启用自定义错误时,HandleErrorAttribute过滤器才会生效,在<system.web>节点中添加一个customErrors属性即可; 。
1
2
3
4
5
6
7
|
<
system.web
>
<!--定制错误页aa.html-->
<
customErrors
mode
=
"On"
defaultRedirect
=
"/Content/aa.html"
/>
</
system.web
>
|
Mode属性的默认值是RemoteOnly在开发期间,HandleErrorAttribute将不会拦截异常,但当应用程序部署到产品服务器时,并从另一台计算机发出请求时HandleErrorAttribute变生效 。
1
2
3
4
5
6
7
|
[HandleError(ExceptionType =
typeof
(ArgumentNullException),View =
"Null"
)]
public
ActionResult Index(){
return
View();
}
|
在渲染视图时HandleErrorAttribute过滤器会传递一个HandleErrorInfo视图模型对象这是一个封装了异常细节的封装程序 。
。
名称 。 |
类型 。 |
描述 。 |
ActionName 。 |
String 。 |
返回生成异常的Action名称 。 |
ControllerName 。 |
String 。 |
返回生成异常的Controller名称 。 |
Exception 。 |
Exception 。 |
返回此异常 。 |
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@model HandleErrorInfo
@{
ViewBag.Title =
"Sorry"
;
}
<!DOCTYPE html>
<html>
<head>
<meta name=
"viewport"
content=
"width=device-width"
/>
</head>
<body>
@Model.Exception.StackTrace
</body>
</html>
|
备注:使用HandleError过滤器时一定要包含Model.Exception.StackTrace否则视图不会显示给用户,引用没必要给用户展示堆栈信息所以可以将该值放入div并隐藏 。
动作过滤器 。
用于任何目的的多用途过滤器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
namespace
System.Web.Mvc{
// 摘要:定义操作筛选器中使用的方法。
public
interface
IActionFilter{
// 摘要:在执行操作方法后调用。
// 参数:filterContext:
// 筛选器上下文。
void
OnActionExecuted(ActionExecutedContext filterContext);
// 摘要:在执行操作方法之前调用。
// 参数:filterContext:
// 筛选器上下文。
void
OnActionExecuting(ActionExecutingContext filterContext);
}
}
|
ActionExecutingContext 属性 。
。
名称 。 |
类型 。 |
描述 。 |
ActionDescriptor 。 |
ActionDescriptor 。 |
动作方法的描述 。 |
Result 。 |
ActionResult 。 |
动作方法的结果,设置属性非空值,过滤器可以取消请求 。 |
。
ActionExecutedContext 属性 。
。
名称 。 |
类型 。 |
描述 。 |
ActionDescriptor 。 |
ActionDescriptor 。 |
动作方法的描述 。 |
Canceled 。 |
Bool 。 |
如果该动作被另一个过滤器取消,则返回true 。 |
Exception 。 |
Exception 。 |
返回由另一个过滤器或动作方法抛出的异常 。 |
ExceptionHandled 。 |
Bool 。 |
如果异常被处理返回true 。 |
Result 。 |
ActionResult 。 |
。 |
。
结果过滤器:
它会对动作方法所产生的结果进行操作 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
namespace
System.Web.Mvc{
// 摘要:定义结果筛选器所需的方法。
public
interface
IResultFilter{
// 摘要:在操作结果执行后调用。
// 参数:filterContext:
// 筛选器上下文。
void
OnResultExecuted(ResultExecutedContext filterContext);
// 摘要:在操作结果执行之前调用。
// 参数:filterContext:
// 筛选器上下文。
void
OnResultExecuting(ResultExecutingContext filterContext);
}
}
|
动作方法如何返回动作结果,让用户能够将动作方法的意图与动作方法的执行分离。将结果过滤器运用于一个动作方法时会在动作方法返回结果时、但在执行该动作结果之前调用OnResultExecuting。动作结果执行之后调用OnResultExecuted 。
内建的动作过滤器和结果过滤器 。
Mvc框架包含一个内建的类,可以用来创建动作过滤器和结果过滤器,这个类的名称ActionFilterAttribute 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
namespace
System.Web.Mvc{
// 摘要:表示筛选器特性的基类。
public
abstract
class
ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter{
// 摘要:在执行操作方法后由 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public
class
ProfileAllAttribute: ActionFilterAttribute{
private
Stopwatch timer;
public
override
void
OnActionExecuting(ActionExecutingContext filterContext){
timer = Stopwatch.StartNew();
}
public
override
void
OnActionExecuted(ActionExecutedContext filterContext){
timer.Stop();
filterContext.HttpContext.Response.Write(
string
.Format(
"<div>Total elapsed time:{0}</div>"
, timer.Elapsed.TotalSeconds));
}
}
public
class
HomeController : Controller{
[ProfileAll]
public
ActionResult Index(){
return
View();}
}
|
其它过滤器属性:
public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer 。
过滤器的几种实现形式:
①全局过滤器 。
在FilterConfig中直接注册实现类 。
②实现接口 。
③注解 。
对过滤器执行排序 。
过滤器是按类型执行的其顺序:授权-》Action-》result。如果有未处理异常,框架在任一阶段都会执行异常过滤器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
namespace
System.Web.Mvc
{
// 摘要:表示操作和结果筛选器特性的基类。
public
abstract
class
FilterAttribute : Attribute, IMvcFilter{
// 摘要: 获取或设置一个值,该值指示是否可指定筛选器特性的多个实例。
// 返回结果:如果可指定筛选器特性的多个实例,则为 true;否则为 false。
public
bool
AllowMultiple {
get
; }
// 摘要: 获取或者设置执行操作筛选器的顺序。
// 返回结果:执行操作筛选器的顺序。
public
int
Order {
get
;
set
; }
}
}
|
内建过滤器 。
。
过滤器 。 |
描述 。 |
RequireHttps 。 |
强迫Action使用Https协议 。 |
OutputCache 。 |
缓存一个Action的 。 |
ValidateInputand 。 ValidationAntiForgeryToken 。 |
与安全性有关的授权过滤器 。 |
AsyncTimeout 。 NoAsyncTimeout 。 |
用户异步控制器 。 |
ChildActionOnlyAttribute 。 |
一个支持Html.action和Html.RenderAction辅助器方法的过滤器 。 |
。
。
RequireHttps 。
RequireHttps过滤器让Action强制使用HTTPS协议。他将用户浏览器重定向到同一个动作,但使用‘https://'协议前缀 。
在形成不安全请求时,重写HandledNonHttpsRequest(),以创建自定义行为,该过滤器仅用于GET请求,POST则会丢掉数据;该过滤器时授权过滤器 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/cuijl/p/6523595.html 。
最后此篇关于ASP.NET mvc4中的过滤器的使用的文章就讲到这里了,如果你想了解更多关于ASP.NET mvc4中的过滤器的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个我想暂时存储的对象。该对象现在在 Controller 中, Controller 将生成一个 View 。 AJAX 请求从 View 发送到下一个 Controller 。那一刻我需要先前
从MVC 2开始,我们可以轻松创建区域。现在,我的问题与嵌套区域(区域内部的区域)有关。 选择我的“father”区域文件夹,右键单击> Add> NO选项以获取new Area。 是否有可能以其他方
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我已经尝试了一些谷歌搜索和堆栈流搜索,但事实证明这比我想象的要难找到。我需要为我们的商店迁移到 ASP.NET MVC 2 的管理提供理由。最大的帮助将是任何企业级站点或使用 ASP.NET MVC
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我有一些常见的网页,它们将出现在多个 MVC 应用程序中。对于这些页面,我想在不同的 MVC 网站之间重用相同的源代码( Controller + View )。这样做的最佳方法是什么? ASP.NE
我正在使用 Spring MVC 来构建我的应用程序。 当用户在浏览器中运行应用程序时,我想显示一个默认的 jsp。我不想用 web.xml 中的标记。 我想我可以用 我已经创建了一个文件夹并添
我可能在这里分析过度了,但是根据我对 MVC 的阅读,似乎有很多关于如何做事情的观点。 是否有一个“最佳实践”网站或文档来定义 MVC 各个部分的职责? 请记住,我使用 EF/Repository&U
当杰里米和查德 posted about their FubuMvc project ,他们提到的差异化因素之一是他们的“雷霆穹顶校长”: The “Thunderdome Principle” –
我正在为 Spring MVC 应用程序实现缓存清除系统。 为了让这个系统正常工作,我必须从给定的 url 中删除“缓存破坏代码”。假设我生成的缓存破坏代码是“123”,我有一个 .css url:/
在调试 ASP.NET MVC 源时,我发现使用了“MVC-ControllerTypeCache.xml” 文件。但我无法理解这个文件的用途。我的意思是这个文件存储在哪里?asp.net MVc 如
我刚刚在我的本地机器上安装了 Visual Studio 11 和 MVC 4 beta。但是,每当我打开一个 MVC 3 项目(我想保留为 MVC 3)时,所有引用都已更新为版本 4 DLL。当然它
我有一个 MVC 3 应用程序,它具有一些核心功能(最重要的是自动化),但主要用作不同区域或模块的门户。我想将它组织到不同的模块中,只需稍作更改也可以部署为他们自己的网站。 该项目由论坛、博客引擎、用
我有自己的服务器,正在考虑将我的一个解决方案升级到 ASP.NET MVC 4,然后再升级其余的 (3+)。 作为其中的一部分,我下载了 the standalone installer对于 ASP.
构图 我有一个 MVC 项目,其中包含 C# 类,这些类最终通过 ajax 等进行序列化和使用。我使用 TypeLite 生成这些 C# 类的定义( here 讨论了 TypeLite 的替代方案),
我正在尝试了解现代 Web 应用程序架构。在 ASP.NET MVC 中,所有业务逻辑类都在 Model 中,Controller 接受并引导用户请求。如果我使用它,是否可以使用本身是 MVC 架构但
我有一个带有 OWIN 的 WebAPI 2 应用程序。现在我正在尝试向所有内容添加一个 MVC 5 Controller ,但没有找到我的 MVC 路由。我收到以下错误: No HTTP resou
在 MVC 3 中,他们添加了我一直在使用的依赖解析器。在回答某人对您发表评论的问题时,您应该使用 Ninject MVC 3 插件。 所以我的问题是为什么要使用它而不是内置的?如果这是要走的路,你如
我是 ASP.NET MVC 的新手,我正在寻找最不痛苦的方法来设置全局错误处理、日志记录和报告(通过电子邮件)。仅供引用,我的 ASP.NET MVC 应用程序在 Azure 中作为 Web 角色托
何时使用 MVC View 页面和 MVC View 内容页面?它们有什么区别? 最佳答案 **MVC View Page 用于创建页面,MVC VewP Content Page 用于创建页面并指定
我是一名优秀的程序员,十分优秀!