在我的_layout.cshtml
页面中,我有一些需要隐藏在某些页面上的元素。我知道我们不会显示某些部分的页面。对于单个页面,我可以这样做:
@if (ViewContext.RouteData.Values["action"].ToString() != "LogIn") {
<div> .... <div>
}
但是这会让多个页面变得混乱和冗长。某个地方,理想情况下不在_Layout
页面中,我可以构建一个操作列表,如果当前操作是其中任何一个,请将boolean
变量(ShowStuff
)设置为false。然后在_Layout
上执行此操作:
@if (ShowStuff== true) {
<div> .... <div>
}
我只是不确定检查该操作列表并设置布尔值的最佳实践方法。 _Layout
页面是否可以像普通视图一样拥有自己的模型和控制器?
答案 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> }
。这是我脑海中最简单的解决方案。