博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)
阅读量:5126 次
发布时间:2019-06-13

本文共 4735 字,大约阅读时间需要 15 分钟。

使用特殊方法处理请求生命周期事件

为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest。举个例子,就像 Application_Start 和 Application_End 方法,ASP.NET 框架就会在事件触发的时候找到这些函数并触发它。下面是更新后的代码片段:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.Web.Routing; 7  8 namespace SimpleApp 9 {10     public class MvcApplication : System.Web.HttpApplication11     {12         protected void Application_Start()13         {14             AreaRegistration.RegisterAllAreas();15             RouteConfig.RegisterRoutes(RouteTable.Routes);16         }17 18         protected void Application_BeginRequest()19         {20             RecordEvent("BeginRequest");21         }22 23         protected void Application_AuthenticateRequest()24         {25             RecordEvent("AuthenticateRequest");26         }27 28         protected void Application_PostAuthenticateRequest()29         {30             RecordEvent("PostAuthenticateRequest");31         }32 33         private void RecordEvent(string name)34         {35             List
eventList = Application["events"] as List
;36 if (eventList == null)37 {38 Application["events"] = eventList = new List
();39 }40 eventList.Add(name);41 }42 }43 }
View Code

我定义了一个叫做 RecordEvent 的方法,用来接收一个事件的名称作为参数,并将其存储到 HttpApplication 类的 Application 属性中。

注意:在没有深入了解 Application 属性之前,请勿滥用这个属性。

我从添加到全局应用类中的其他三个方法中调用了 RecordEvent 方法。这些方法会在 BeginRequest, AuthenticateRequest 和 PostAuthenticateRequest 触发的时候被调用。我们暂时不需要将这些函数显式注册成事件处理器,ASP.NET 框架会自动定位和调用这些函数。

展示事件信息

为了展示我们代码中接收到的事件的信息,我们需要更改 Home controller 和它的 Index 视图。代码如下:

1 using SimpleApp.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Web; 6 using System.Web.Mvc; 7  8 namespace SimpleApp.Controllers 9 {10     public class HomeController : Controller11     {12         public ActionResult Index()13         {14             return View(HttpContext.Application["events"]);15         }16 17         [HttpPost]18         public ActionResult Index(Color color)19         {20             Color? oldColor = Session["color"] as Color?;21 22             if (oldColor != null)23             {24                 Votes.ChangeVote(color, (Color)oldColor);25             }26             else27             {28                 Votes.RecordVote(color);29             }30 31             ViewBag.SelectedColor = Session["color"] = color;32             return View(HttpContext.Application["events"]);33         }34     }35 }
View Code

为了获取到存储在全局应用类中的数据,我们需要使用到 HttpContext.Application 属性,我们后面会详细讲解上下文对象。现在,我们需要更新相关的 Razor 视图:

1 @using SimpleApp.Models 2 @model List
3 @{ 4 Layout = null; 5 } 6 7 8 9 10 11
12
13
Vote14
15
16 17 18
19 20 @if (ViewBag.SelectedColor == null)21 {22

Vote for your favourite color

23 }24 else25 {26

Change your vote from @ViewBag.SelectedColor

27 }28 29
30 @using (Html.BeginForm())31 {32 @Html.DropDownList("color", new SelectList(Enum.GetValues(typeof(Color))), "Choose a Color", new { @class = "form-control" })33 34
35
36
37 }38
39
40 41
42
Results
43 44
45
46
47
48
49 @foreach (Color c in Enum.GetValues(typeof(Color)))50 {51
52
53
54
55 }56
Color Votes
@c @Votes.GetVotes(c)
57
58 59
60
Events
61
62 @foreach (string eventName in Model)63 {64
65 }66
@eventName
67
68 69
View Code

事件名称列表作为模型对象传递到视图中,我们使用 Razor foreach 循环来生成 HTML table 元素。

图 1 - 展示生命周期事件详情

提示:这种技术只能使用在排在 PreRequestHandlerExecute 事件之前的事件之上,因为 controller 中的 action 方法会在 PreRequestHandlerExecute 和 PostRequestHandlerExecute 事件之间执行,所以后续触发的事件都已经在响应生成好之后发生了。

[根据 Adam Freeman – Pro ASP.NET MVC 5 Platform 选译]

转载于:https://www.cnblogs.com/levid-gc/p/5176765.html

你可能感兴趣的文章
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>
linux history
查看>>
jQuery on(),live(),trigger()
查看>>
Python2.7 urlparse
查看>>
sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>
svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复
查看>>
java处理url中的特殊字符%等
查看>>
你的第一个Django程序
查看>>
Tomcat免安装版的环境变量配置以及Eclipse下的Tomcat配置和测试
查看>>
Unity3D性能优化之Draw Call Batching
查看>>