RenderSection() 是不是在 ASP.NET Core 的 <environment> 标签助手中工作?

Posted

技术标签:

【中文标题】RenderSection() 是不是在 ASP.NET Core 的 <environment> 标签助手中工作?【英文标题】:Does RenderSection() work inside ASP.NET Core's <environment> tag-helper?RenderSection() 是否在 ASP.NET Core 的 <environment> 标签助手中工作? 【发布时间】:2017-03-10 10:38:21 【问题描述】:

布局有这个:

<!DOCTYPE html>
<html>
<head>
  <environment names="Development">@RenderSection("devCss", required: false)</environment>
  <environment names="Staging,Production">@RenderSection("staproCss", required: false)</environment>
</head>
<body>
  @RenderBody()
  <environment names="Development">@RenderSection("devJs", required: false)</environment>
  <environment names="Staging,Production">@RenderSection("staproJs", required: false)</environment>
</body>
</html>

查看有这个:

@section devCss  <link rel="stylesheet" href="foo.css" asp-append-version="true" /> 
@section staproCss  <link rel="stylesheet" href="foo.min.css" asp-append-version="true" /> 
@section devJs 
@section staproJs 

<h1>hello</h1>

RenderSection()&lt;environment&gt; 标签之外时,一切正常。

在里面时,如上例所示,它会失败并出现无用的错误InvalidOperationException: The following sections have been defined but have not been rendered by the page at '_Layout.cshtml': 'staproCss, staproJs'. To ignore an unrendered section call IgnoreSection("sectionName").

这显然没有意义,因为所有部分都已定义。它抱怨的是一些,而不是其他的。

&lt;environment&gt; 标签助手是否允许 RenderSection() 在其中?

【问题讨论】:

只有那些与环境匹配的部分在运行时被定义。在将内容渲染到每个部分之前,您需要添加相应的环境检查。例如 @section devCss This is the dev stuff @user2818985 这是有道理的。未定义的环境不会发出里面的东西,这会导致子视图失败。如果您将其添加为我可以接受的答案。 可能有更好的方法来实现你想要的 欢迎您;> @user2818985 我根据您的评论添加了答案。 【参考方案1】:

只需在&lt;/body&gt; 标记末尾添加@RenderSection("Scripts", required: false)

【讨论】:

我有同样的问题,你的回答对我有帮助....插入“脚本”我使用“页脚”来渲染导航栏 谢谢。我能够呈现替换默认 Identity.UI 的页面。不幸的是,它们是在单个应用页面之外加载的。但是,总比没有好:)【参考方案2】:

此答案感谢@user2818985 的评论。

未定义的环境不会发出其中的内容。这意味着它不会发出RenderSection() 调用。这意味着视图将定义一个不存在的section foo ... 。失败了,因此异常。

为了实现我最初的目标,我更新了布局:

@inject Microsoft.AspNetCore.Hosting.IHostingEnvironment _env
<!DOCTYPE html>
<html>
<head>
    <environment names="Development">
        @RenderSection("devCss", required: false)
    </environment>
    <environment names="Staging,Production">
        @RenderSection("staproCss", required: false)
    </environment>
    @if (_env.EnvironmentName == "Development" && IsSectionDefined("staproCss"))
    
        IgnoreSection("staproCss"); 
    
    @if (_env.EnvironmentName == "Staging,Production" && IsSectionDefined("devCss"))
     
        IgnoreSection("devCss"); 
    
</head>
<body>
    @RenderBody()
    <environment names="Development">
        @RenderSection("devJs", required: false)
    </environment>
    <environment names="Staging,Production">
        @RenderSection("staproJs", required: false)
    </environment>
    @if (_env.EnvironmentName == "Development" && IsSectionDefined("staproJs")) 
     
        IgnoreSection("staproJs"); 
    
    @if (_env.EnvironmentName == "Staging,Production" && IsSectionDefined("devJs")) 
     
        IgnoreSection("devJs"); 
    
</body>
</html>

所以部分总是被定义的,所以子视图永远不会抛出。

【讨论】:

我不认为_env.EnvironmentName == "Staging,Production" 比较会起作用,因为环境将是暂存生产......而不是两者。您需要一个函数来检查逗号分隔列表中是否存在真实环境名称 (_env.EnvironmentName)。 而不是将那些 if 测试用 _env vars 放在最后,您可以将 if 放在每个环境块中,然后测试该部分是否已定义。【参考方案3】:

不,环境标签用于根据 ASPNET_ENV 环境变量定义的环境呈现不同的 HTML。例如,与生产环境相比,开发环境可以使用一组不同的 CSS 定义。

此链接也可能会有所帮助: A Complete Guide to the MVC 6 Tag Helpers

您可以在您的网站逻辑中使用环境变量值,如此处所示。

查看此链接了解更多信息:Working with Multiple Environments

【讨论】:

我了解&lt;environment&gt; 标签助手的工作原理及其用途。问题是它是否允许在其中使用RenderSection()?我希望如此,但我得到了例外。 PS,你给出的例子,正是我的问题所在。 :) 我扩展了我的答案以解决您问题的隐含目标。

以上是关于RenderSection() 是不是在 ASP.NET Core 的 <environment> 标签助手中工作?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC - 在布局中有条件地渲染部分

@RenderSection,@RenderPage,@RenderBody介绍

Razor 中的@rendersection

如何将 MVC 子 Action PartialView 渲染到 Layout @RenderSection() 中?

MVC3 Razor @RenderSection

MVC3 Razor @RenderSection