布局有这个:
<!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()
在其中?
答案 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
有关详细信息,请参阅此链接:Working with Multiple Environments
答案 2 :(得分:0)
只需在@RenderSection("Scripts", required: false)
标记的末尾添加</body>
。