asp.net 从内容页面到布局的核心传递数据

asp.net core pass data from content page to layout

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

我看过部分视图和部分,它们似乎都按我想要的方式工作 "backwards" - 在这种情况下,我希望默认值为 'display all the elements',但对于特殊页面,我希望能够关闭一个元素。

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

您可以通过多种不同的方式实现这一目标。如果你只想 "turn off" 页面的一个区域,最简单的方法可能是 ViewData。类似于:

_Layout.cshtml

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

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

SomeView.cshtml

@{
    ViewData["ShowThis"] = false;
}

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

_Layout.cshtml

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

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

SomeView.cshtml

@section Foo {}

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

@section Foo
{
    <!-- alternate HTML here -->
}

您可以尝试在 asp.net mvc

的 _Layout 页面中传递 ViewData
public class DynamicMenuAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
       base.OnActionExecuted(filterContext);
       var result = filterContext.Result as ViewResult;
       result.ViewData["key"] = "Hello Bangladesh";
    }
}

将依赖注入添加到 Startup.cs 文件

services.AddMvc(
    config =>
    {
       config.Filters.Add(new DynamicMenuAttribute());
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

现在你可以 ViewData["key"] 在 _Layout.cshtml