ASP.NET MVC 3 Razor输出缓冲区视图吗?

Joh*_*lak 3 asp.net razor asp.net-mvc-3

在ASP.NET MVC 3 Razor中,您可以使用以下命令指定页面标题:

@{
    ViewBag.Title = "Title";
}
Run Code Online (Sandbox Code Playgroud)

现在,假设我们有一个布局页面:

<title>@ViewBag.Title | Website</title>
Run Code Online (Sandbox Code Playgroud)

当ASP去渲染页面时,它需要输出一些布局页面HTML,然后是视图HTML,然后是布局页面HTML的其余部分.

为了输出布局页面HTML的前半部分,ASP.NET需要知道ViewBag.title视图中给出的值.因此,ASP.NET需要在视图中解析Razor代码.但是,ASP.NET还不能输出视图的HTML代码,因为它仍在输出布局页面的HTML代码.那么ASP.NET是否将视图的HTML输出存储在缓冲区中?这似乎是一种不好的做法,但我想不出有任何其他方法可以有效地将视图的标题放入布局页面输出中.

Jam*_*ull 7

当ASP去渲染页面时,它需要输出一些布局页面HTML,然后是视图HTML,然后是布局页面HTML的其余部分.

这就是Web表单的呈现方式.但是由于你描述的问题(以及其他一些)mvc内部渲染.

因此,内部视图首先呈现为临时缓冲区.然后是布局页面.当缓冲区随后写入响应流并刷新时,此呈现将继续,直到到达最外层布局页面.

这不会导致任何问题90%的时间(猜测)但是如果您需要提前清除响应,这将导致头痛.

仅供参考,可以使用以下方式访问视图的缓冲区:

HtmlHelper.ViewContext.Writer
Run Code Online (Sandbox Code Playgroud)

所以回答你的问题,是的 - 它确实缓冲了视图.