[译] ASP.NET 生命周期 – 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 选译]

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

micropython lcd触摸屏显示中文_基于Micropython的天气显示 进程帖

本帖最后由 michael_llh 于 2019-4-17 10:06 编辑更下项目的进程哈&#xff01;项目的思路很简单&#xff0c;就是从网上获取天气信息&#xff0c;然后进行显示&#xff01;很尽量把过程写清楚&#xff0c;方便大家的交流和学习。首先说明下使用的硬件信息&#xff1a;Micropyt…

linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...

摘要在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对Shell 循环语句的for循环进行了介绍&#xff0c;本篇给大家介绍下Shell 中另一种循环语句&#xff1a;Shell while循环。在上一篇Linux Shell系列教程之(十)Shell for循环中&#xff0c;我们已经对…

存储过程优缺点总结

优点&#xff1a; 1、快速 a、当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时&#xff09;&#xff0c;可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作&#xff0c;如果用程序来完成&#xff0c;就变成了一条条的 SQ…

c语言作业重庆科技学院,C语言程序设计学生上机报告-NO3.doc

C语言程序设计学生上机报告-NO3.doc重庆科技学院 上机实验报告(上机操作类) 课程名称 C 语 言 程 序 设 计 实验项目 循环结构程序设计(一) 机房名称 I313 上机时间 2017 年 11 月 19 日 指导老师 焦晓军 上机成绩 学生姓名 曾云 学号 2015441907 专业班级 机电 15-3 一、上机操…

sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器

各位新朋友&#xff5e;记得先点蓝字关注我哦&#xff5e;11月19日&#xff0c;21点&#xff0c;小编正六指霸屏&#xff0c;决赛圈1V4&#xff0c;忽然&#xff0c;电话响了&#xff0c;这种感觉很熟悉&#xff0c;不错&#xff0c;上次差点推掉对面水晶的那一幕又上演了……作…

linux fb应用例子,Linux下利用framebuffer画点的程序小例子

Linux下利用framebuffer画点的程序小例子&#xff1a;/** ** Filename: framebuffer.c** Description: linux下利用framebuffer画点的程序小例子** Version: 1.0* Created: 2011年02月25日 10时33分29秒* Revision: none* Compiler: …

pb利用datawindow查询符合条件的数据并且过滤掉其他数据_数据质量监测

1 Overview1.1 数据质量在数据部门里&#xff0c;数据质量问题经常是被动发现&#xff0c;所以数据质量的问题是大多数公司数据部门都不得不面对的问题。数据质量校验的目标是监控数据管道中&#xff0c;生产者、处理阶段以及消费者的数据的正确性、一致性和及时性的一项系统工…

PadLeft函数

string num12num.PadLeft(4, 0); //结果为为 0012 看字符串长度是否满足4位,不满足则在字符串左边以"0"补足 转载于:https://www.cnblogs.com/shy1766IT/p/5184937.html

将解决方案和项目放在同一目录中_借助卡第那思3D电子目录,巴鲁夫使用CAE数据扩展其产品目录...

巴鲁夫作为一家中型企业&#xff0c;1921年成立于毗邻斯图加特市的诺伊豪森&#xff0c;80年代初期直至后来很长的一段时间内&#xff0c;巴鲁夫是巴西第一家及唯一一家从事自主生产的传感器制造商。如今巴鲁夫不再仅仅位于诺伊豪森&#xff0c;而是遍布欧洲、亚洲、北美、南美…

c语言math函数 sgn,常用矩阵计算C语言代码

参考资料&#xff1a;行列式&#xff1a;http://zh.wikipedia.org/wiki/行列式#.E4.BB.A3.E6.95.B0.E4.BD.99.E5.AD.90.E5.BC.8F伴随矩阵&#xff1a;http://zh.wikipedia.org/wiki/伴随矩阵余因子矩阵&#xff1a;http://zh.wikipedia.org/wiki/余因子矩阵逆矩阵&#xff1a;h…

pip: The ultimate package manager for Python

安装Package pip install <package name>列出已安装的Package pip list查看已安装的Package的详细信息 pip show <package name>搜索PyPi上的Package pip search <keyword>卸载已安装的Package pip uninstall <package name>转载于:https://www.cnblog…

python调用mysql数据库sql语句过长有问题吗_python连接MYSQL数据库,调用update语句后无法更新数据,解决...

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server&#xff0c;具有企业许可…

c语言结构体出现乱码,结构体数组输出时出现了乱码情况 求大神帮帮看程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#define N 3struct Student{int num;char name[20];int count;}; int useful_poll0;int useless_poll0;int total_poll0;int main(){void input(struct Student stu[]);void print(struct Student stu[]);struct S…

动态创建对象

C#主要支持 5 种动态创建对象的方式&#xff1a;   1. Type.InvokeMember   2. ContructorInfo.Invoke   3. Activator.CreateInstance(Type)   4. Activator.CreateInstance(assemblyName, typeName)   5. Assembly.CreateInstance(typeName)  最快的是方式 3 &…

python公式如何编写_如何编写 Python 程序,资深Python大咖教你玩转Python

如何编写Python程序&#xff0c;这从来就不是一件很难的事。下面我教你保存和运行 Python 程序的标准步骤&#xff0c;如下&#xff1a;对于 PyCharm 用户1. 打开 PyCharm。2. 以给定的文件名创建新文件。3. 输入案例中给出的代码。4. 右键并运行当前文件。注意&#xff1a;每当…

c语言学籍管理系统小程序,学籍业务办理系统(开源 v2.0发布 优化代码,增加小程序端)...

更新说明&#xff1a;1、此2.0版&#xff0c;大幅度优化代码&#xff0c;增加小程序端方便使用2、v1.0测试地址已关&#xff0c;请勿测试学生在校期间避免不了要和各种证明打交道&#xff0c;比如学籍证明、转专业申请、休学申请、退学申请等等。此类业务一般流程都是学生去找老…

Android 下的EXIF

一.什么是Exif Exif(Exchangeable Image File 可交换图像文件)是一种图象文件格式&#xff0c;它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息&#xff0c;包括拍 摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件…

hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)

“Hill的加密与解密”Hill加密是另一种多字母代替密码&#xff0c;与多表代替密码不同的是&#xff0c;Hill密码要求将明文分成同等规模的若干个分组(最后一个分组涉及到填充)&#xff0c;每一个分组被整体的加密代换&#xff0c;即希尔密码属于分组加密。Hill密码的算法思想是…

python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理能力.jpg)...

为了在家安心学习&#xff0c;我决定写一段代码播放上课的铃声。之前中学时就希望有一个这样的软件&#xff0c;周末就可以高效学习了。但是网上搜不到相关软件&#xff0c;当时也不会写代码&#xff0c;就用闹钟来代替了。现在自己写一个试试。原本我是用C写的&#xff0c;但后…

那些地方会用C语言多线程,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …