如何在mvc4中的所有页面中显示侧边栏,除了2

时间:2013-05-22 16:37:36

标签: c# .net asp.net-mvc asp.net-mvc-4 razor

我们目前有一个网站,其中包含一条最新新闻,必填:在布局中定义了false 并且除了两个之外的所有视图都具有相同调用的部分RenderPartial(“ShowLatestNews”)

有更好的方法吗?即遵循DRY原则 - 在一个地方定义并隐藏/不在这两个视图中使用它?

更新 -

目前,布局是基于用户从dbconfig中动态选择的 理想情况下,我们不希望根据控制器和动作组合来切换布局

2 个答案:

答案 0 :(得分:1)

这个问题开启了很多不同的方向,很多这些路径都是由当前设计决定的。

其他人则剪切和粘贴解决方案


让我们假设您目前有两个页面与网站的主要布局完全不同,但彼此相似(前管理页面)或可能与其他“可预见”页面具有相同布局的页面。然后我建议更改这些页面的布局 - 使每个布局多样化以便单独使用:

管理页面

@{ 
    Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
}

常规页面

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

但现在让我们说你/我/谁真的只是想让这些页面分开主要布局,但需要它们根据一些信息(ex admin,VIP标签)有点不同 奇怪的是,这里的想法有所改变,我们是否希望Controller决定做什么或者View已经拥有这些信息......理想情况下,数据可以放在ViewModel或ViewBag或Session数据中 - 再次依赖于:)< / p>

按用户 - HTTP上下文(剪切和粘贴解决方案......)

<div id="specific-content">
    @if (User.Identity.IsAuthenticated && User.IsInRole("admin")) <!--RoleProvider-->
    {
        <div>My Admin Content!</div>
        <!--In your case render something (or not)!-->
        @{ Html.RenderPartial(...); }
    }
    else
    {
        <div>I'm not special :( </div>
    }
</div>

或者不是将上面的代码放在布局或页面上,而是将其直接放入Partial

他们还想到了另外一个,那就是如果用户是某个人,那就是重定向到一个页面,我不是他的忠实粉丝 - 坚持布局和User in观点。

这些是我想到的更简单的想法,希望有所帮助!

答案 1 :(得分:0)

现在这可能是最有说服力的解决方案,但它很简单。在您的布局页面中,将此代码用于部分:

@if (ViewBag.HideSection == null)
{
    @Html.RenderPartial("ShowLatestNews")
}

现在,在2控制器操作中,您不希望部分渲染添加此内容:

ViewBag.HideSection = true;

它只会隐藏您在ViewBag中指定内容的部分。它不是评估真或假,只是存在属性。