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

问题描述 投票:1回答:2

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

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

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

asp.net-core-mvc razor-pages
2个回答
4
投票

您可以通过多种不同方式实现这一目标。如果你想简单地“关闭”页面的一个区域,最简单的方法可能是使用ViewData。就像是:

_Layout.cshtml

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

如果没有定义true键,这将导致它默认为ViewData(显示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 -->
}

-1
投票

您可以尝试在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);

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

© www.soinside.com 2019 - 2024. All rights reserved.