Asp.net core mvc asp.net核心将数据从内容页传递到布局

Asp.net core mvc asp.net核心将数据从内容页传递到布局,asp.net-core-mvc,razor-pages,Asp.net Core Mvc,Razor Pages,我正在尝试设置一个master layout.cshtml页面,该页面对除一个或两个页面(通常是登录和注销)之外的所有页面都保持一致。在我的布局中,我想显示一些我不想为这些特殊页面显示的元素 我看到了部分视图和部分,它们似乎都按照我想要的方式“向后”工作——在本例中,我希望默认设置为“显示所有元素”,但对于特殊页面,我希望能够关闭元素 我看过以前的代码,它使用PageData将变量传递给布局(这似乎非常有用,因为我可以在相关页面中打一个bool,然后在布局中检查它),但这似乎已被删除。有没有其他

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

我看到了部分视图和部分,它们似乎都按照我想要的方式“向后”工作——在本例中,我希望默认设置为“显示所有元素”,但对于特殊页面,我希望能够关闭元素


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

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

\u Layout.cshtml

@if (ViewData["ShowThis"] as bool? ?? true)
{
    <!-- HTML here -->
}
@{
    ViewData["ShowThis"] = false;
}
@if (!IsSectionDefined("Foo"))
{
    <!-- HTML here -->
}
else
{
    @RenderSection("Foo", required: false)
}
@section Foo {}
或者,您可以使用节。这将使您能够选择性地用其他内容替换HTML

\u Layout.cshtml

@if (ViewData["ShowThis"] as bool? ?? true)
{
    <!-- HTML here -->
}
@{
    ViewData["ShowThis"] = false;
}
@if (!IsSectionDefined("Foo"))
{
    <!-- HTML here -->
}
else
{
    @RenderSection("Foo", required: false)
}
@section Foo {}
或者你也可以在里面放些东西,用以下东西代替这个区域:

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

您可以尝试在asp.net mvc的布局页面中传递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);

现在您可以在_Layout.cshtml

查看数据[“key”]
,谢谢,我现在正在使用后一种方法,渲染一个空白部分有点异味。我尝试使用ViewData,但我缺少了默认值if null的提示。干杯