如何在_Layout页面上设置变量?

Exi*_*tos 12 asp.net-mvc razor asp.net-mvc-3

我有一个视图,我想使用布局页面.在布局页面中,我想要一个条件横幅,其中一些视图将打开/关闭.只是想知道我怎么能这样做?

我在_Layout.cshtml页面中有这个...

@if (ShowBanner){

   <h1>banner</h1>

}
Run Code Online (Sandbox Code Playgroud)

我想知道如何从我的MVC View页面打开/关闭它?或者这是否是正确的做法?我的意思是,如果我在View页面中声明该变量,主人肯定不知道它吗?两者如何通过c#进行通信?我使用Viewbag吗?而不是.

我知道表格的全部内容是关于引用Page或Master成员,但似乎很难看出它与MVC ...

任何帮助非常感谢...

谢谢皮特

Eth*_*own 12

我和你在一起,Exitos:我也避免使用它ViewBag.除了愚蠢的名字,我不喜欢随之而来的弱打字.有一个解决方案,但它涉及到一些,所以请耐心等待.

首先,创建一个类来存储要传递给布局的"显示提示".我创造性地称这个类为"DisplayHints":

public class DisplayHints {
  // anything that you want passed from a view to the layout goes here
  public bool ShowBanner { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,创建一个从中派生的类WebViewPage<T>,它将成为视图的新基类.请注意我们如何拥有一个名为DisplayHints存储的属性ViewData(可用于控制器,视图和布局):

public abstract class MyViewPage<T> : WebViewPage<T> {
  public DisplayHints DisplayHints {
    get {
      if( !ViewData.ContainsKey("DisplayHints") )
        ViewData["DisplayHints"] = new DisplayHints();
      return (DisplayHints)ViewData["DisplayHints"];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

作为一个评论者指出,下面ViewData是弱类型,就像ViewBag.但是,有没有办法,我知道的避免存储一些ViewData/ ViewBag; 这只是将弱类型变量的数量减少到一个.完成此操作后,您可以根据需要存储尽可能多的强类型信息DisplayHints.

既然你有一个基类用于你的视图Web.config,我们需要告诉MVC使用你的自定义基类:

<pages pageBaseType="MyNamespace.Views.MyViewPage">
Run Code Online (Sandbox Code Playgroud)

这听起来很麻烦,但是你为所有这些工作获得了一些严肃的功能.现在在您的视图中,您可以设置所需的任何显示提示,如下所示:

@{ DisplayHints.ShowBanner = true; }
Run Code Online (Sandbox Code Playgroud)

在您的布局中,您可以轻松访问它:

@if( DisplayHints.ShowBanner ) {
  <div>My banner....</div>
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!