2012-05-26 31 views
3

在ASP.NET MVC 3剃鬚刀,你可以指定頁面標題:ASP.NET MVC 3 Razor輸出緩衝區視圖?

@{ 
    ViewBag.Title = "Title"; 
} 

現在,假設我們有一個佈局頁面:

<title>@ViewBag.Title | Website</title> 

當ASP去渲染頁面,它將需要輸出一些佈局頁面的HTML,然後查看HTML,然後佈局HTML頁面的其餘部分。

爲了輸出佈局頁面HTML的前半部分,ASP.NET需要知道在視圖中給出的值ViewBag.title。因此,ASP.NET需要解析視圖中的Razor代碼。但是,ASP.NET無法輸出視圖的HTML代碼,因爲它仍在輸出佈局頁面的HTML代碼。那麼ASP.NET是否將視圖的HTML輸出存儲在緩衝區中?這似乎是一個不好的做法,但我想不出任何其他方式有效地將視圖的標題放入佈局頁面輸出中。

回答

7

當ASP去呈現一個頁面時,它將需要輸出一些佈局頁面的HTML,然後查看HTML,然後是HTML頁面的其餘部分。

這就是Web表單的呈現方式。然而,由於你描述的問題(以及其他一些問題),mvc從內到外渲染。

因此,內部視圖首先呈現給臨時緩衝區。然後佈局頁面。當緩衝區寫入響應流並刷新時,該渲染將繼續進行,直至達到最外層佈局頁面。

這不會導致任何問題90%的時間(令人反感)但是如果您需要儘早刷新響應,這會引起頭痛。

FYI的意見緩衝區可以訪問:

HtmlHelper.ViewContext.Writer 

因此,要回答你的問題,是的 - 它緩衝了意見。

+0

+1爲「內翻」。這很好地描述了它。它引起了我同樣的一時困惑,因爲它引起了這裏的提問者,但除此之外,它完美地工作:) –

+0

感謝您的偉大答案! –

+1

對於任何未來發現此頁面的人,本文可能會有幫助:http://blog.josemanuelperez.es/2011/05/bigpipe-in​​-asp-net-mvc-using-razor/ –