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

时间:2012-04-10 19:05:56

标签: asp.net-mvc asp.net-mvc-3 razor

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

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

@if (ShowBanner){

   <h1>banner</h1>

}

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

我知道表格是关于引用Page或Master成员的所有内容,但似乎无法用MVC看到它......

任何帮助都非常感谢...

由于 皮特

3 个答案:

答案 0 :(得分: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; }
}

然后,创建一个派生自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"];
    }
  }
}

正如下面指出的评论者所说,ViewData是弱类型的,就像ViewBag一样。但是,我无法避免在ViewData / ViewBag中存储某些内容;这只是将弱类型变量的数量减少到一个。完成此操作后,您可以根据需要在DisplayHints中存储尽可能多的强类型信息。

现在你有了一个基础类视图,在Web.config中,我们需要告诉MVC使用你的自定义基类:

<pages pageBaseType="MyNamespace.Views.MyViewPage">

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

@{ DisplayHints.ShowBanner = true; }

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

@if( DisplayHints.ShowBanner ) {
  <div>My banner....</div>
}

我希望这有帮助!

答案 1 :(得分:3)

拥有布局模型不是一个好主意,因为它会强制所有视图使用该模型。但是,您可以将这种类型的信息放入ViewBag中,并在您的某个控制器库的构造函数中填充该值。

答案 2 :(得分:2)

您可以在布局中定义SECTION,然后如果View负责“填充”该部分...您的视图可以将HTML放在该部分中。

在这里,您可以看到有关使用SECTIONS的详细分步教程:

http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx