RenderSection()是否在ASP.NET Core的<environment> tag-helper中工作?

时间:2016-10-27 16:25:37

标签: c# asp.net razor asp.net-core tag-helpers

布局有这个:

<!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()超出<environment>标记时,一切正常。

当在里面时,如上例所示,它失败了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").

的无用错误

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

<environment>代码助手是否允许RenderSection()在其中?

3 个答案:

答案 0 :(得分:5)

这个答案归功于@ 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>

因此,部分始终被定义,因此子视图永远不会抛出。

答案 1 :(得分:1)

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

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

您可以在网站逻辑中使用环境变量值,如下所示。 enter image description here

有关详细信息,请参阅此链接:Working with Multiple Environments

答案 2 :(得分:0)

只需在@RenderSection("Scripts", required: false)标记的末尾添加</body>