【问题标题】:C# Razor Page - Include @section Scripts inside _Layout (Dot net core)C# Razor 页面 - 在 _Layout 中包含 @section 脚本(点网核心)
【发布时间】:2021-02-21 11:33:27
【问题描述】:

假设从Controller/Model 收到的动态脚本有以下@section 代码:(dotnet core v3)

        string scriptHtml = ViewData["scriptData"];
        @section Scripts {
            @if(! string.IsNullOrEmpty(scriptHtml)){
                <script type='text/javascript'>
                    @Html.Raw(scriptHtml)
                </script>
                <script type='text/javascript' src='~/js/appcore/site.reuse.js'></script>
            }
        }

我想在 _Layout.cshtml 中使用这个,换句话说:我希望能够在_Layout.cshtml 中包含一个脚本部分,这将在包含它的所有页面中保持一致。

所以基本上,_Layout.cshtml 应该如下所示(仅显示 Javascript 部分):


@section Scripts {
    @if(! string.IsNullOrEmpty(scriptHtml)){
         <script type='text/javascript'>
              @Html.Raw(scriptHtml)
          </script>
          <script type='text/javascript' src='~/js/appcore/site.reuse.js'></script>
     }
}
    <footer class="border-top footer text-muted">
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)  <!-- not rendered because it is not in the parent 'ie. Index.cshtml' page....

当这个@section不在_Layout.cshtml中但移动到调用_Layout.cshtml的父剃须刀页面(例如Index.cshtml)时,它将被正确包含。然而,这意味着我必须为每个剃须刀页面 @section 这个脚本。

我可以做些什么来包含一个“动态”Javascript 脚本并使其可在所有使用 _Layout.cshtml 的页面中重复使用?

【问题讨论】:

    标签: razor .net-core razor-pages


    【解决方案1】:

    @Section 块不打算在布局页面中使用,除非它是另一个布局页面的子布局。部分仅在查看页面中使用(收集)。 _Layout 中的任何 @Script 部分都将被忽略。

    因为这是由多个页面共享(重用)的,所以只需像普通嵌入脚本一样包含它。条件将确保它被包含在内。

    所以只需在_Layout.cshtml(或布局文件)中包含条件块删除@Section标签并将其移近其他脚本。

    更新_Layout页面:

        <footer class="border-top footer text-muted"></footer>
    
        @if(!string.IsNullOrEmpty(scriptHtml)){
             // This condition will ensure to correctly include when not empty
             <script type='text/javascript'>
                  @Html.Raw(scriptHtml)
              </script>
              <script type='text/javascript' src='~/js/appcore/site.reuse.js'></script>
         }
    
        <script src="~/lib/jquery/dist/jquery.min.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    
        @RenderSection("Scripts", required: false) 
    

    注意:这个@RenderSection 将只包含视图中的脚本。

    【讨论】:

    • 所以,你的意思是说我应该像已经在做的那样将它添加到每个parent page 中(索引、关于等)?这很不幸:(另外,有没有办法为“_Layout”制作一个“子布局”,以便我可以以其他方式包含它?
    • 否 - 如果它出现在所有使用布局的页面中,则将其放入布局中。更新了我的答案以澄清这一点
    • 好的,我想我知道你想说什么。我不能如我所愿地使用部分,但因为它是可重用的东西,我可以简单地将它嵌入为(正常)非@Section i> 脚本。谢谢 - 希望我可以在 _Layout 中“捆绑一个 @Section”脚本部分。
    • 感谢您的帮助 - 我现在稍微改变了我的想法,但现在基本上可以了。
    猜你喜欢
    • 2020-05-26
    • 2021-02-04
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多