ASP.NET MVC实践教程第9篇有哪些内容?

2026-05-25 10:434阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1248个文字,预计阅读时间需要5分钟。

ASP.NET MVC实践教程第9篇有哪些内容?

filter实际上是一个特性(属性),它提供了一种向controller或action中添加特定功能的方法。当controller或action被调用时,会触发filter中定义的相关方法。

filter实际上是一个特性(attribute),它提供了一种向controller或 action中添加某些任务的方法,当controller或 action被调用时,会触发filter中定义的相应方法。filter应该算AOP的一种实现方式,关于AOP的内容大家可以参考张逸的文章www.cnblogs.com/wayfarer/articles/241024.html,图文并茂对AOP讲解的十分清楚。所以我们就可以在某种程度上利用filter来分解横向和纵向的应用,比方说日志,权限,缓存,防盗链等等应用。

一、我们先来看看ASP.NET MVC框架提供的几种默认filter类型:
1、Authorize:

准备工作:进入C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727文件夹,双击aspnet_regsql.exe选择好相应的数据库,创建membership,AuthorizeAttribute使用membership来进行权限验证的,所以我们需要先在membership中准备一个用户lfm,一个角色Admin,我们使用studio的项目-》ASP.NET配置创建即可。

[Authorize(Roles="Admin")]
publicActionResultIndex()
{
ViewData["Message"]="WelcometoASP.NETMVC!";

returnView();
}

如果lfm不属于Admin角色时Index页是不能访问的

2、OutputCache:

[OutputCache(Duration=60,VaryByParam="none")]
publicActionResultAbout()
{
returnView();
}

然后我们修改About加入:

<%=DateTime.Now.ToString() %>

我们会发现在一分钟内我们刷新About页面其输出并不改变。这个和webform中的页面缓存机制非常相似。

这里我们也可以统一的配置时间和条件

配置文件
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname="MyProfile"duration=”60”varyByParam=”none”/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>

Controler中输入

[OutputCache(CacheProfile="MyProfile")]
publicActionResultAbout()
{
returnView();
}

3、Exception

Exception
[HandleError(ExceptionType=typeof(ArgumentException),View="Error")]
publicActionResultGetProduct(stringname)
{
if(name==null)
{
thrownewArgumentNullException("名字为空");
}
returnView();
}

标明HandleError属性后的Action,当内部出现异常时会根据异常类型跳转到相应的View,这里需要注意的是上面的源码在开发期无法看到效果,必须部署到iis上才能看到效果。实际上这个简单处理在项目中用处不大,一般我们都会写自己的异常处理方式,自定义异常处理我们一会再自定义filter中讲解。

二、自定义filter实例:

我们先来看一下跟filter相关的类结构:

一般情况下我们自定义的filter都是继承FilterAttribute类然后再扩展相应的接口的,下面我们举几个例子:

1、自定义异常处理

自定义异常处理
1publicclassExceptionFilter:FilterAttribute,IExceptionFilter
2{
3voidIExceptionFilter.OnException(ExceptionContextfilterContext)
4{
5filterContext.Controller.ViewData["ErrorMessage"]=filterContext.Exception.Message;
6filterContext.Result=newViewResult()
7{
8ViewName="Error",
9ViewData=filterContext.Controller.ViewData,
10};
11filterContext.ExceptionHandled=true;
12}

使用

Controller
[ExceptionFilter]
publicActionResultGetView(stringname)
{
if(name==null)
{
thrownewArgumentNullException("名字为空");
}
returnView();
}

浏览器中输入:localhost:3983/Home/GetView

这样我们就可以根据自己的项目情况来处理异常了。

2、监控Action运行时间的Timer

TimerAttribute
1usingSystem.Diagnostics;
2usingSystem.Web.Mvc;
3publicclassTimerAttribute:ActionFilterAttribute
4{
5publicTimerAttribute()
6{
7//Bydefault,weshouldbethelastfiltertorun
8//sowerunjustbeforeandaftertheactionmethod.
9this.Order=int.MaxValue;
10}
11publicoverridevoidOnActionExecuting(ActionExecutingContextfilterContext)
12{
13varcontroller=filterContext.Controller;
14if(controller!=null)
15{
16varstopwatch=newStopwatch();
17controller.ViewData["__StopWatch"]=stopwatch;
18stopwatch.Start();
19}
20}
21publicoverridevoidOnActionExecuted(ActionExecutedContextfilterContext)
22{
23varcontroller=filterContext.Controller;
24if(controller!=null)
25{
26varstopwatch=(Stopwatch)controller.ViewData["__StopWatch"];
27stopwatch.Stop();
28controller.ViewData["__Duration"]=stopwatch.Elapsed.TotalMilliseconds;
29}
30}
31}

使用

[Timer]
publicActionResultTestTimer()
{
Thread.Sleep(100);
returnView();
}

页面显示:

<%=ViewData["__Duration"]%>

三、filter相关接口方法的执行顺序:

根据上面的结构图我们知道跟filter相关的总共有四个接口,六个方法,这些方法如果在同一个类中实现时是有个优先级顺序的

IAuthorizationFilter>IActionFilter>IResultFilter>IExceptionFilter
接下来我们写个程序来验证这个顺序:

TestOrder属性类
1usingSystem.Web.Mvc;
2usingSystem.Collections.Generic;
3usingSystem.IO;
4namespaceFilterDemo.Controllers
5{
6publicclassTestOrderAttribute:FilterAttribute,IResultFilter,IActionFilter,IAuthorizationFilter,IExceptionFilter
7{
8#regionIResultFilter成员
9
10publicvoidOnResultExecuted(ResultExecutedContextfilterContext)
11{
12Write("OnResultExecuted");
13
14}
15
16privatestaticvoidWrite(stringmethodName)
17{
18StreamWritersw=newStreamWriter("c:\\test.txt",true);
19sw.WriteLine(methodName);
20sw.Close();
21}
22
23publicvoidOnResultExecuting(ResultExecutingContextfilterContext)
24{
25Write("OnResultExecuting");
26}
27
28#endregion
29
30#regionIActionFilter成员
31
32publicvoidOnActionExecuted(ActionExecutedContextfilterContext)
33{
34Write("OnActionExecuted");
35}
36
37publicvoidOnActionExecuting(ActionExecutingContextfilterContext)
38{
39Write("OnActionExecuting");
40}
41
42#endregion
43
44#regionIAuthorizationFilter成员
45
46publicvoidOnAuthorization(AuthorizationContextfilterContext)
47{
48Write("OnAuthorization");
49}
50
51#endregion
52
53#regionIExceptionFilter成员
54
55publicvoidOnException(ExceptionContextfilterContext)
56{
57Write("OnException");
58filterContext.ExceptionHandled=true;
59}
60
61#endregion
62}
63
64}

使用

[TestOrder]
publicActionResultTestFilterOrder()
{
//thrownewException("lfm");
returnView();
}

前端

<%throw new Exception("异常出现"); %>

这时候我们打开c:\test.txt得到的结果为:

OnAuthorization
OnActionExecuting
OnActionExecuted
OnResultExecuting
OnResultExecuted
OnException

四、参考

ASP.NET MVC实践教程第9篇有哪些内容?

《Professional ASP.NET MVC 1.0》

www.cnblogs.com/leoo2sk/archive/2008/11/05/1326655.html

www.cnblogs.com/wayfarer/articles/241024.html

www.cnblogs.com/chsword/archive/2009/03/12/zd_mvc6.html

五、源码

我的ASP.NET MVC实践系列

ASP.NET MVC实践系列1-UrlRouting

ASP.NET MVC实践系列2-简单应用

ASP.NET MVC实践系列3-服务器端数据验证

ASP.NET MVC实践系列4-Ajax应用

ASP.NET MVC实践系列5-结合jQuery

ASP.NET MVC实践系列6-Grid实现(上)

ASP.NET MVC实践系列7-Grid实现(下-利用Contrib实现)

ASP.NET MVC实践系列8-对查询后分页处理的解决方案

其他:

在ASP.NET MVC中对表进行通用的增删改


本文共计1248个文字,预计阅读时间需要5分钟。

ASP.NET MVC实践教程第9篇有哪些内容?

filter实际上是一个特性(属性),它提供了一种向controller或action中添加特定功能的方法。当controller或action被调用时,会触发filter中定义的相关方法。

filter实际上是一个特性(attribute),它提供了一种向controller或 action中添加某些任务的方法,当controller或 action被调用时,会触发filter中定义的相应方法。filter应该算AOP的一种实现方式,关于AOP的内容大家可以参考张逸的文章www.cnblogs.com/wayfarer/articles/241024.html,图文并茂对AOP讲解的十分清楚。所以我们就可以在某种程度上利用filter来分解横向和纵向的应用,比方说日志,权限,缓存,防盗链等等应用。

一、我们先来看看ASP.NET MVC框架提供的几种默认filter类型:
1、Authorize:

准备工作:进入C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727文件夹,双击aspnet_regsql.exe选择好相应的数据库,创建membership,AuthorizeAttribute使用membership来进行权限验证的,所以我们需要先在membership中准备一个用户lfm,一个角色Admin,我们使用studio的项目-》ASP.NET配置创建即可。

[Authorize(Roles="Admin")]
publicActionResultIndex()
{
ViewData["Message"]="WelcometoASP.NETMVC!";

returnView();
}

如果lfm不属于Admin角色时Index页是不能访问的

2、OutputCache:

[OutputCache(Duration=60,VaryByParam="none")]
publicActionResultAbout()
{
returnView();
}

然后我们修改About加入:

<%=DateTime.Now.ToString() %>

我们会发现在一分钟内我们刷新About页面其输出并不改变。这个和webform中的页面缓存机制非常相似。

这里我们也可以统一的配置时间和条件

配置文件
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<addname="MyProfile"duration=”60”varyByParam=”none”/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>

Controler中输入

[OutputCache(CacheProfile="MyProfile")]
publicActionResultAbout()
{
returnView();
}

3、Exception

Exception
[HandleError(ExceptionType=typeof(ArgumentException),View="Error")]
publicActionResultGetProduct(stringname)
{
if(name==null)
{
thrownewArgumentNullException("名字为空");
}
returnView();
}

标明HandleError属性后的Action,当内部出现异常时会根据异常类型跳转到相应的View,这里需要注意的是上面的源码在开发期无法看到效果,必须部署到iis上才能看到效果。实际上这个简单处理在项目中用处不大,一般我们都会写自己的异常处理方式,自定义异常处理我们一会再自定义filter中讲解。

二、自定义filter实例:

我们先来看一下跟filter相关的类结构:

一般情况下我们自定义的filter都是继承FilterAttribute类然后再扩展相应的接口的,下面我们举几个例子:

1、自定义异常处理

自定义异常处理
1publicclassExceptionFilter:FilterAttribute,IExceptionFilter
2{
3voidIExceptionFilter.OnException(ExceptionContextfilterContext)
4{
5filterContext.Controller.ViewData["ErrorMessage"]=filterContext.Exception.Message;
6filterContext.Result=newViewResult()
7{
8ViewName="Error",
9ViewData=filterContext.Controller.ViewData,
10};
11filterContext.ExceptionHandled=true;
12}

使用

Controller
[ExceptionFilter]
publicActionResultGetView(stringname)
{
if(name==null)
{
thrownewArgumentNullException("名字为空");
}
returnView();
}

浏览器中输入:localhost:3983/Home/GetView

这样我们就可以根据自己的项目情况来处理异常了。

2、监控Action运行时间的Timer

TimerAttribute
1usingSystem.Diagnostics;
2usingSystem.Web.Mvc;
3publicclassTimerAttribute:ActionFilterAttribute
4{
5publicTimerAttribute()
6{
7//Bydefault,weshouldbethelastfiltertorun
8//sowerunjustbeforeandaftertheactionmethod.
9this.Order=int.MaxValue;
10}
11publicoverridevoidOnActionExecuting(ActionExecutingContextfilterContext)
12{
13varcontroller=filterContext.Controller;
14if(controller!=null)
15{
16varstopwatch=newStopwatch();
17controller.ViewData["__StopWatch"]=stopwatch;
18stopwatch.Start();
19}
20}
21publicoverridevoidOnActionExecuted(ActionExecutedContextfilterContext)
22{
23varcontroller=filterContext.Controller;
24if(controller!=null)
25{
26varstopwatch=(Stopwatch)controller.ViewData["__StopWatch"];
27stopwatch.Stop();
28controller.ViewData["__Duration"]=stopwatch.Elapsed.TotalMilliseconds;
29}
30}
31}

使用

[Timer]
publicActionResultTestTimer()
{
Thread.Sleep(100);
returnView();
}

页面显示:

<%=ViewData["__Duration"]%>

三、filter相关接口方法的执行顺序:

根据上面的结构图我们知道跟filter相关的总共有四个接口,六个方法,这些方法如果在同一个类中实现时是有个优先级顺序的

IAuthorizationFilter>IActionFilter>IResultFilter>IExceptionFilter
接下来我们写个程序来验证这个顺序:

TestOrder属性类
1usingSystem.Web.Mvc;
2usingSystem.Collections.Generic;
3usingSystem.IO;
4namespaceFilterDemo.Controllers
5{
6publicclassTestOrderAttribute:FilterAttribute,IResultFilter,IActionFilter,IAuthorizationFilter,IExceptionFilter
7{
8#regionIResultFilter成员
9
10publicvoidOnResultExecuted(ResultExecutedContextfilterContext)
11{
12Write("OnResultExecuted");
13
14}
15
16privatestaticvoidWrite(stringmethodName)
17{
18StreamWritersw=newStreamWriter("c:\\test.txt",true);
19sw.WriteLine(methodName);
20sw.Close();
21}
22
23publicvoidOnResultExecuting(ResultExecutingContextfilterContext)
24{
25Write("OnResultExecuting");
26}
27
28#endregion
29
30#regionIActionFilter成员
31
32publicvoidOnActionExecuted(ActionExecutedContextfilterContext)
33{
34Write("OnActionExecuted");
35}
36
37publicvoidOnActionExecuting(ActionExecutingContextfilterContext)
38{
39Write("OnActionExecuting");
40}
41
42#endregion
43
44#regionIAuthorizationFilter成员
45
46publicvoidOnAuthorization(AuthorizationContextfilterContext)
47{
48Write("OnAuthorization");
49}
50
51#endregion
52
53#regionIExceptionFilter成员
54
55publicvoidOnException(ExceptionContextfilterContext)
56{
57Write("OnException");
58filterContext.ExceptionHandled=true;
59}
60
61#endregion
62}
63
64}

使用

[TestOrder]
publicActionResultTestFilterOrder()
{
//thrownewException("lfm");
returnView();
}

前端

<%throw new Exception("异常出现"); %>

这时候我们打开c:\test.txt得到的结果为:

OnAuthorization
OnActionExecuting
OnActionExecuted
OnResultExecuting
OnResultExecuted
OnException

四、参考

ASP.NET MVC实践教程第9篇有哪些内容?

《Professional ASP.NET MVC 1.0》

www.cnblogs.com/leoo2sk/archive/2008/11/05/1326655.html

www.cnblogs.com/wayfarer/articles/241024.html

www.cnblogs.com/chsword/archive/2009/03/12/zd_mvc6.html

五、源码

我的ASP.NET MVC实践系列

ASP.NET MVC实践系列1-UrlRouting

ASP.NET MVC实践系列2-简单应用

ASP.NET MVC实践系列3-服务器端数据验证

ASP.NET MVC实践系列4-Ajax应用

ASP.NET MVC实践系列5-结合jQuery

ASP.NET MVC实践系列6-Grid实现(上)

ASP.NET MVC实践系列7-Grid实现(下-利用Contrib实现)

ASP.NET MVC实践系列8-对查询后分页处理的解决方案

其他:

在ASP.NET MVC中对表进行通用的增删改