ASP.NET MVC:处理逻辑& _Layout页面

时间:2015-06-19 15:27:43

标签: asp.net-mvc

在我的_layout.cshtml页面中,我有一些需要隐藏在某些页面上的元素。我知道我们不会显示某些部分的页面。对于单个页面,我可以这样做:

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

但是这会让多个页面变得混乱和冗长。某个地方,理想情况下不在_Layout页面中,我可以构建一个操作列表,如果当前操作是其中任何一个,请将boolean变量(ShowStuff)设置为false。然后在_Layout上执行此操作:

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

我只是不确定检查该操作列表并设置布尔值的最佳实践方法。 _Layout页面是否可以像普通视图一样拥有自己的模型和控制器?

2 个答案:

答案 0 :(得分:1)

与MikeSW的答案类似,我会使用动作过滤器,但我会使用特定的ViewModel填充ViewData。当你想显示它时只需显示值,如果它被填充,模板将被模型所使用的任何类型使用,如果它是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) 

答案 1 :(得分:0)

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