[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)

简介: 使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest。举个例子,就像 Application_Start 和 Application_End 方法,ASP.NET 框架就会在事件触发的时候找到这些函数并触发它。

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

为了在全局应用类中处理这些事件,我们会创建一个名称以 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.HttpApplication
11     {
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<string> eventList = Application["events"] as List<string>;
36             if (eventList == null)
37             {
38                 Application["events"] = eventList = new List<string>();
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 : Controller
11     {
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             else
27             {
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<string>
 3 @{
 4     Layout = null;
 5 }
 6 
 7 <!DOCTYPE html>
 8 
 9 <html>
10 <head>
11     <meta charset="utf-8" />
12     <meta name="viewport" content="width=device-width" />
13     <title>Vote</title>
14     <link rel="stylesheet" href="~/Content/bootstrap.min.css" />
15     <link rel="stylesheet" href="~/Content/bootstrap-theme.min.css" />
16 </head>
17 <body class="container">
18     <div class="panel panel-primary">
19 
20         @if (ViewBag.SelectedColor == null)
21         {
22             <h4 class="panel-heading">Vote for your favourite color</h4>
23         }
24         else
25         {
26             <h4 class="panel-heading">Change your vote from @ViewBag.SelectedColor</h4>
27         }
28 
29         <div class="panel-body">
30             @using (Html.BeginForm())
31             {
32                 @Html.DropDownList("color", new SelectList(Enum.GetValues(typeof(Color))), "Choose a Color", new { @class = "form-control" })
33 
34                 <div>
35                     <button class="btn btn-primary center-block" type="submit">Vote</button>
36                 </div>
37             }
38         </div>
39     </div>
40 
41     <div class="panel panel-primary">
42         <h5 class="panel-heading">Results</h5>
43 
44         <table class="table table-striped table-condensed">
45             <tr>
46                 <th>Color</th>
47                 <th>Votes</th>
48             </tr>
49             @foreach (Color c in Enum.GetValues(typeof(Color)))
50             {
51                 <tr>
52                     <td>@c</td>
53                     <td>@Votes.GetVotes(c)</td>
54                 </tr>
55             }
56         </table>
57     </div>
58 
59     <div class="panel panel-primary">
60         <h5 class="panel-heading">Events</h5>
61         <table class="table table-condensed table-striped">
62             @foreach (string eventName in Model)
63             {
64                 <tr><td>@eventName</td></tr>
65             }
66         </table>
67     </div>
68 </body>
69 </html>
View Code

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

展示生命周期事件详情

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

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

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

相关文章
|
6月前
|
存储 开发框架 前端开发
asp.net与asp.net优缺点及示例
asp.net与asp.net优缺点及示例
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
63 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
99 5
|
3月前
|
开发框架 安全 搜索推荐
分享105个NET源码ASP源码,总有一款适合您
分享105个NET源码ASP源码,总有一款适合您
27 4
|
7月前
|
开发框架 前端开发 .NET
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
176 0
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
|
8月前
|
存储 开发框架 .NET
ASP.NET学生管理系统(.NET毕业设计)
ASP.NET学生管理系统(.NET毕业设计)
100 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件
|
10月前
|
开发框架 供应链 前端开发
net基于asp.net的社区团购网站
社区团购系统依托社区团购系统和社区门店,是现在的一个重大市场和发展方向,通过研究企业在社区团购系统环境下的营销模式创新,对于普通的零售业和传统社区团购系统的转型发展具有重要的理论意义。随着互联网行业的发展,人们的生活方式发生着重大变化,人们越来越倾向于网络购物,这对传统企业来说如何把客户留下是一个重大挑战。就现在而言,由于社区团购的竞争已经进入最紧张激烈的阶段,有些团购平台甚至已经彼此之间打起了价格战,其中不乏有平台因为利润变少或资金链断裂而半途败亡。企业在实际的商业活动中,往往会面临许多等待优化的问题。因此,要在竞争激烈的市场中拔得头筹,必须重视提升对新商业模式的全面认知,科学于实际贴合的分
|
Web App开发 .NET 数据安全/隐私保护
一起谈.NET技术,ASP.NET身份验证机制membership入门——项目
  前面说了很多关于membership的内容,感觉内容有点凌乱,内容都是一个个知识点,下面我们通过一个小的项目,来把所有的相关内容串一下。   首先描述一下需求:   我们要做一个最简单的网站。有三类用户:匿名用户,员工,管理员,网站结构如下:        admin目录下的页面只允许admin角色的用户访问,employee目录下的页面只允许emp角色的用户访问。
1084 0