12

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

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

@if (ShowBanner){

   <h1>banner</h1>

}

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

我知道表单都是关于引用页面或主成员的,只是似乎无法用 MVC 看到它......

非常感谢任何帮助...

谢谢皮特

4

3 回答 3

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. 但是,我没有办法避免在/中存储一些东西;这只是将弱类型变量的数量减少到一个。完成此操作后,您可以根据需要存储尽可能多的强类型信息。ViewDataViewBagDisplayHints

现在您已经有了视图的基类,在 中Web.config,我们需要告诉 MVC 使用您的自定义基类:

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

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

@{ DisplayHints.ShowBanner = true; }

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

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

我希望这有帮助!

于 2012-04-10T19:44:58.193 回答
3

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

于 2012-04-10T19:09:09.493 回答
2

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

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

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

于 2012-04-10T19:41:20.993 回答