【问题标题】:@RenderSection in nested razor templates嵌套剃刀模板中的@RenderSection
【发布时间】:2012-01-24 14:48:27
【问题描述】:

我的问题是,当在基本模板中定义 @RenderSection 时,我似乎无法使用嵌套模板中的 @RenderSection。目前,我有一个嵌套的基本模板,它链接到一个子模板,然后在视图页面中使用。当我在基本模板中定义 @RenderSection 并将其呈现在视图页面中时,它会引发错误。

这是确切的问题。

我想创建一个 RenderSection 以允许我插入自定义脚本。 我的基本模板....

<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
 @RenderSection("HeaderContent", false) // The region of the header scripts (custom css)

</head>
<body>
@RenderBody()
</body>
</html>

然后我跳过子模板,因为我不想在其中放置任何自定义头代码并将其应用于页面本身。..

@section HeaderContent {
    <script>alert("hi");</script>
}

我的问题是我似乎无法从我的普通页面将自定义头代码添加到基本模板中。

以下部分已定义但尚未为布局页面~/Views/Shared/OneColLayer.cshtml": "HeaderContent 呈现。

是否需要在视图页面中包含指向基本模板的指针?

@{
    Layout = "~/Views/Shared/BaseTemplate.cshtml";
}

我的新基础模板

<head>
  <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/layout.css")" />
  <link rel="stylesheet" type="text/css" href="@Url.Content("~/content/global.css")" />
  <script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"></script>
  <script type="text/javascript" src="@Url.Content("~/js/fadeInFadeOut.js")"></script>
  <title>@ViewBag.Title</title>
  @RenderSection("HeaderContent", false)
</head>
<body>
  @RenderBody()
</body>

我的新子模板

@{
  Layout = "~/Views/Shared/BaseTemplate.cshtml";
}
@RenderSection("HeaderContent", false)
@RenderBody()

我的看法

@{
  ViewBag.Title = "Home";
  Layout = "~/Views/Shared/OneColLayer.cshtml";
}
@section HeaderContent {
  <h1>Left Content</h1>
}
<div>my view content</div>

内容被放置在 oneCol 模板中,现在是基本模板。

结果...

<div id="Content">
   <h1>Left Content</h1>
</div>

【问题讨论】:

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


    【解决方案1】:

    您需要在中间模板中指定允许通过的部分。

    BaseTemplate.cshtml

    <!DOCTYPE html>
    <html>
      <head>
        <title>@ViewBag.Title</title>
        @RenderSection("HeaderContent", false) @* The region of the header scripts (custom css) *@
      </head>
    <body>
      @RenderBody()
    </body>
    </html>
    

    编辑

    您的新子模板

    @{
      Layout = "~/Views/Shared/BaseTemplate.cshtml";
    }
    @section HeaderContent {
      @RenderSection("HeaderContent", false)
    }
    @RenderBody()
    

    如果您将渲染部分放在基本模板的一个部分中,它将将该部分呈现在基本模板上的正确位置。


    View.cshtml -> 使用 MiddleLayout.cshtml 作为布局

    @section HeaderContent
    {
        <!-- header content that will now render -->
    }
    
    <!-- page content -->
    

    【讨论】:

    • 我尝试过这种方法。但是我视图中的内容会显示在它继承的模板上,而不是基本模板上。
    • @JamesAndrewSmith 根据您的编辑,它显示在您的中间模板上,因为您没有将@RenderSection 放在渲染部分的中间模板中。我将编辑我的,以向您展示您的确切外观。
    • 我希望有更好的方法来冒泡部分声明。除了@section script { @RenderSection("script") }
    • 嗨,如何将 rendersection html 字符串获取到 cshtml 页面。 @{ 字符串示例标题; } @if (IsSectionDefined("SampleHeading")) { sampleHeading = RenderSection("SampleHeading").ToString();

      @Html.Display("sampleHeading");

    • 这非常有效。谢谢!不过,它应该会自动通过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多