2015-06-19 76 views
0

在我的_layout.cshtml页面中,我有一些需要在某些页面上隐藏的元素。我知道我们不会显示某些部分的页面。对于一个页面,我可以这样做:ASP.NET MVC:处理_Layout页面中的逻辑和变量

@if (ViewContext.RouteData.Values["action"].ToString() != "LogIn") { 
    <div> .... <div> 
} 

但是,这会变得混乱和多页的长。有些地方,理想情况下不在_Layout页面中,我可以创建一个动作列表,如果当前动作是其中的任何动作,请将boolean变量(ShowStuff)设置为false。然后,只需做这个_Layout

@if (ShowStuff== true) { 
    <div> .... <div> 
} 

我只是不知道在那里会是最好的实践方式来检查的行为该名单并设置布尔值。 _Layout页面是否可以像普通视图一样拥有自己的模型和控制器?

+2

布局页仅仅是一个局部的用作主模板。它不能有模型,也不需要控制器。 – MikeSW

+0

好的,谢谢MikeSW –

+0

它们是布局中的全局元素还是视图中的全局元素? –

回答

0

如果开发人员不再为他们遇到的每个问题寻找“最佳方式”,那将会很棒。没有最好的办法,只是斟酌的解决方案。这里是我的:你可以创建一个动作过滤器[ShowNav]并装饰你需要的任何控制器/动作。该过滤器将把一个布尔值放入HttpContext.Items。然后创建一个检查布尔值的HtmlHelper。然后在_layout中,if (Html.CanShowNavig()) { <nav> }。这是我脑海中最简单的解决方案。

+0

好的。一个HTML助手。我没有想到这一点。谢谢。 –

+0

其实是一个动作过滤器(最重要的部分)+ html助手 – MikeSW

+0

好的...我不熟悉动作过滤器。我会花一些时间在Google上 –

1

类似于MikeSW的回答,我会使用一个动作过滤器,但我会用特定的ViewModel填充ViewData。当你想显示它时,只需要显示DisplayFor的值,如果它被填充,模板将被模型使用的任何类型,如果它是null,则不显示任何内容。 (从存储器下面的实施例,可能不完全正确。)

public BlahModelAttribute : ActionFilterAttribute 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    BlahModel model = Db.GetModel(); 
    filterContext.Controller.ViewData.Set(model); 
    } 
} 

ViewData的扩展:

public static ViewDataExtensions 
{ 
    private static string GetName<T>() 
    : where T : class 
    { 
    return typeof(T).FullName; 
    } 

    public static void Set<T>(this ViewDataDictionary viewData, T value) 
    : where T : class 
    { 
    var name = GetName<T>(); 
    viewData[name] = value; 
    } 

    public static T Get<T>(this ViewDataDictionary viewData) 
    : where T : class 
    { 
    var name = GetName<T>(); 
    return viewData[name] as T; 
    } 
} 

在视图:

@{var blahModel = ViewData.Get<BlahModel>() } 
@Html.DisplayFor(m => blahModel)