我有一个观点,我想用一个页面布局。 在布局页我想有一个有条件的旗帜其中的一些观点将开启/关闭。 只是想知道怎样才能做到这一点?
我有这样的_Layout.cshtml网页...
@if (ShowBanner){
<h1>banner</h1>
}
我想知道我怎么可以在/从我的MVC查看页面关闭这个功能? 或者这是否是在所有正确的事情? 我的意思是,如果我宣布,在查看页面变量想必主人不知道呢? 如何在两个通过C#的沟通? 难道我用Viewbag? 不要吧。
我知道与形式的所有关于引用页面或高级会员,只是不能似乎相当与MVC看看吧......
任何帮助非常赞赏...
感谢皮特
我和你在一起,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>
}
我希望这有帮助!
有您的布局模式是不是因为它会迫使所有视图使用该模型是一个好主意。 但是,你可以把这种类型的信息到ViewBag,并有填充在你的控制器基地之一的构造函数的值。
您可以在布局定义部分,然后在您的View负责人向“补”那一段......你的观点可以放置在该节中的HTML。
在这里,您可以看到使用段的详细信息教程一步一步:
http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx