【问题标题】:ASP.MVC change _Layout elements from controller or view levelASP.MVC 从控制器或视图级别更改 _Layout 元素
【发布时间】:2017-04-11 17:20:51
【问题描述】:

我共享了具有部分菜单和正文 (RenderBody) 的 _Layout。我想在控制器或视图级别控制 _Layout 的呈现方式。对于一个控制器操作或视图我想隐藏菜单(_Layout 的一部分),对于其他我想显示它。

是否有任何明确的解决方案可以做到这一点?比如:

thisView.Layout.HideMenu = true

【问题讨论】:

  • 再创建一个没有菜单的布局并使用它
  • 这 2 个布局将共享相同的逻辑,在更新此逻辑时需要额外维护。在解决方案中,我正在使用 Layout 非常复杂。
  • 2 个布局最好,但您始终可以在基本视图模型或 ViewBag 中传递一个值以指示是否应显示元素 - @if (ViewBag.IncludeMenu) { // render menu }

标签: c# asp.net-mvc


【解决方案1】:

您可以创建一个带有布尔属性 bool showMenu {get; set;} 的基本 ViewModel,然后让您的其他 ViewModel 从基本 ViewModel 继承。

最后,在您的_Layout.cshtml(它将以基本 ViewModel 作为其@model)中,您可以执行 Razor if(Model.showMenu)。如果为 true,您的菜单将呈现,如果为 false,它将被隐藏。

【讨论】:

  • 听起来很有趣,但我应该关心将这些属性传递给表单吗?我的意思是当发布数据模型将被绑定到表单 - 不是吗?
  • 这取决于您,如果您希望表单内容确定标志的设置方式,那么您可以随意控制标志。如果表单不相关,则不需要在表单中传递它
  • 您也可以将此值存储在 ViewBag 属性中,而不是将其添加到 ViewModel。
  • 你确实可以。我发现 ViewModel 更容易调试,但是是的,你也可以使用 ViewBag。
  • 好的,这是可能的解决方案之一,我会将其标记为可能的答案。我已经使用描述布局属性的类实现了另一个解决方案。此类的实例存储在单例中并与请求一起存在。它适用于项目的每个级别:布局、控制器操作和视图。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多