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

时间:2017-12-27 13:24:51

标签: asp.net-core-mvc razor-pages

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

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

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

2 个答案:

答案 0 :(得分: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 :(得分:-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"]