【问题标题】:Does ASP.NET MVC 3 Razor output buffer views?ASP.NET MVC 3 Razor 是否输出缓冲区视图?
【发布时间】:2012-05-26 21:48:49
【问题描述】:

在 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 输出存储在缓冲区中?这似乎是一种不好的做法,但我想不出任何其他方法可以有效地将视图的标题放入布局页面输出中。

【问题讨论】:

    标签: asp.net asp.net-mvc-3 razor


    【解决方案1】:

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

    这就是呈现 Web 表单的方式。但是,由于您描述的问题(以及其他一些问题),mvc 会由内而外呈现。

    所以内部视图首先被渲染到一个临时缓冲区。然后是布局页面。这种渲染一直持续到到达最外面的布局页面,然后将缓冲区写入响应流并刷新。

    这在 90% 的情况下(估计)不会导致任何问题,但是如果您需要尽早刷新响应,这将导致头痛。

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

    HtmlHelper.ViewContext.Writer
    

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

    【讨论】:

    • +1 表示“由内而外”。这很好地描述了它。它给我带来了与这里的提问者一样的短暂困惑,但除此之外它完美无缺:)
    • 对于以后发现此页面的任何人,这篇文章可能会有所帮助:blog.josemanuelperez.es/2011/05/…
    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多