3

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

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

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

4

2 回答 2

9

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

_Layout.cshtml

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

如果未定义密钥,这将导致它默认为true(显示 HTML)ViewData,因此在您想要禁用它的视图中,您只需将其定义为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 -->
}
于 2017-12-27T14:00:24.810 回答
-2

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

于 2019-03-03T20:47:55.013 回答