asp.net core 将数据从内容页面传递到布局

gbj*_*anb 2 asp.net-core-mvc razor-pages

我正在尝试设置一个主 layout.cshtml 页面,该页面对除一两个页面(通常是登录和注销)之外的所有页面都有效。在我的布局中,我想显示一些我不想为这些特殊页面显示的元素。

我已经看到了部分视图和部分,它们似乎都以我想要的方式“向后”工作 - 在这种情况下,我希望默认设置为“显示所有元素”,但对于特殊页面,我希望能够打开一个元素关闭。

我已经看到以前的代码使用 PageData 将变量传递给布局(这似乎非常有用,因为我可以在相关页面中打一个 bool 并在布局中检查它),但这似乎已被删除。有没有其他方法可以在不涉及控制器或更新每个页面以仅显示一页上显示我想要隐藏的位的情况下工作?

Chr*_*att 9

有许多不同的方法可以实现这一点。如果您只想“关闭”页面的某个区域,最简单的方法可能是使用ViewData. 就像是:

_Layout.cshtml

@if (ViewData["ShowThis"] as bool? ?? true)
{
    <!-- HTML here -->
}
Run Code Online (Sandbox Code Playgroud)

true如果ViewData未定义键,这将导致它默认为(显示 HTML),因此在您想要禁用它的视图中,您只需要将其定义为false

SomeView.cshtml

@{
    ViewData["ShowThis"] = false;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用部分。这将使您能够有选择地用其他内容替换 HTML。

_Layout.cshtml

@if (!IsSectionDefined("Foo"))
{
    <!-- HTML here -->
}
else
{
    @RenderSection("Foo", required: false)
}
Run Code Online (Sandbox Code Playgroud)

然后,在您看来,您只需定义该部分。如果不想显示任何内容,则可以将其定义为空:

SomeView.cshtml

@section Foo {}
Run Code Online (Sandbox Code Playgroud)

或者您实际上可以在其中放置一些东西来替换该区域:

@section Foo
{
    <!-- alternate HTML here -->
}
Run Code Online (Sandbox Code Playgroud)