【问题标题】:ASP.NET MVC 3 send <head> before <body> rendersASP.NET MVC 3 在 <body> 呈现之前发送 <head>
【发布时间】:2012-04-17 10:13:41
【问题描述】:

我有 asp.net mvc 应用程序,它使用 razor 视图引擎。

我想在 body 渲染之前将 head 发送到浏览器,以开始并行加载 css、js 和图像,并在 css 中链接。 (您可以看到,这种技术如何在 chrome 开发人员工具中的 SO 上工作 - 例如网络) 我在 asp.net 网络表单中发现了关于它的问题:Send head before body to load CSS and JS asap 我尝试使用此解决方案,但它不起作用。

对于剃须刀引擎,接下来的步骤是实际的:

  1. 动作返回视图结果
  2. _ViewStart.cshtml 执行(设置 ViewBag.Layout)
  3. 视图从第一行执行到最后一行(包含代码和部分)
  4. 视图引擎检查 ViewBag.Layout,如果找到 - 执行 Layout(带有 renderind 正文和部分)

我认为好的解决方案是将步骤 3 分成 3 个部分:

  1. 为 Head 和 Css 部分生成内容
  2. 发送到浏览器
  3. 生成视图的其他部分

其他解决方案是静态包含 all.css 和基本 .js 文件(不包含部分内容,从视图生成),发送头部,然后生成视图(生成 FooterScript 部分)。

在这两种方式中,我都需要从布局页面而不是视图开始执行。首先:布局(头部)-视图(部分)-布局(刷新)-视图(其他)-布局(正文)。第二个:布局(头部+冲洗)-视图(全部)+布局(正文)。

我的 _Layout.cshtml 文件:

<html @Html.Raw(ViewBag.xmlns)>
    <head>
        <title>@ViewBag.Title</title>
        @Html.Partial("_MetaTags")    
        <link href="@Url.ThemeCss("jquery-ui-1.8.18.custom.css")" rel="stylesheet" type="text/css" />
        <link href="@Url.Css("masterPage.css")" rel="stylesheet" type="text/css" />          
        <link rel="shortcut icon" href="/favicon.ico"/>

        @RenderSection("Css", required: false)
        <script src="@Url.CommonScript("jquery.common.min.js")" type="text/javascript"></script>
        <script src="@Url.Script("Master.js")" type="text/javascript"></script>        
        @RenderSection("Head", required: false)    
    </head>

    <body>
        <div id="pageWhithoutFooter">    
            <div id="main">
                @RenderBody()
            </div>
        </div>
        @RenderSection("FooterScript", required: false)
    </body>
</html>

怎么做?

【问题讨论】:

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


    【解决方案1】:

    尝试将您的头部部分放入部分视图中,然后在您的控制器中调用它:

    PartialView("_PageHeader").ExecuteResult(ControllerContext);
    Response.Flush();
    
    // Generate model
    
    return View(model);
    

    未对此进行测试,但我不明白为什么它不起作用。

    【讨论】:

    • 部分应该是什么样子:...static includes...和布局应该是什么样子:@RenderBody() ?
    • 这听起来很对。您可以将我的答案中的逻辑包装在一个属性中,或者为您想要应用它的每个操作包含一些东西。
    • 在没有关闭/打开标签的情况下是否可以编译?我对发布构建模式使用预编译选项。
    • 糟糕的是你没有测试它。因为我不明白为什么 @{Response.Flush(); } 放在 和
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多