2011-11-19 108 views
9

我的問題一般關於渲染管道,我已經看到ASP.NET MVC管道方案,並有一個稱爲視圖引擎,所以它是如何工作的?我想知道這種情況:Razor頁面生命週期在ASP.NET MVC

  • 首先渲染什麼,主頁面或視圖?
  • 如果我在@{}塊中使用Response.End()塊,在頁面開始時執行頁面中斷並停止渲染視圖?

回答

15

首先呈現什麼,主頁面或視圖?

該視圖。解析器從佈局開始,並建立一個LIFO(後進先出)結構遞歸到子視圖和部分。一旦LIFO準備就緒,它就會開始彈出並處理元素。這意味着最內層的部分/視圖將在佈局和最後一個要處理的佈局本身之前進行處理。

如果我在頁面開頭的@ {}塊中使用Response.End(),是否會執行頁面中止執行並停止渲染視圖?

在任何視圖中使用Response.End將導致呈現完全空白的頁面。切勿在任何視圖中使用。 Response.End基本上通過觸發ThreadAbortException來中止當前線程,而這並不是您想要在Razor視圖中執行的操作。

+0

哦,謝謝你,這是爲我解釋很多事情! – Alexander

2

看看史蒂夫桑德森的Request-Handling Pipeline Poster。它詳細解釋了整個請求過程。它來自MVC 1.0版,但仍然有效。只需用Razor替換「WebForm」即可。

它真的不應該打擾你是否主或視圖首先呈現。你能解釋爲什麼這對你很重要嗎?

+0

有時候很高興知道事情是如何工作的,它有助於理解它爲什麼像這樣工作,而不是其他方式:) – Alexander

+3

我可以證明這個知識很好的原因。我一直在使用卡帶來捆綁我的項目。它具有靜態方法來在頁面中「包含」資源包。像子視圖中的@ @ Bundles.Reference(「〜/ bundle/pageScripts」,「Head」);}'這樣的代碼塊將首先被執行,如果它依賴於佈局中定義的jquery,佈局的代碼將在子視圖之後執行,這將導致腳本文件的排序不正確。有很多方法可以解決這個問題,但它有助於瞭解爲什麼按照該順序進行調用。 – JonathanTech

+2

@JonathanTech給出的理由是我需要了解這一點的原因 - 只有我使用MVC4的System.Web.Optimization而不是Cassette。儘管如此。 –