[译] 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
總結
以上是生活随笔為你收集整理的[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex 序列化自定义类 解决 shar
- 下一篇: 当老虎来临时