我们目前有一个网站,其中包含一条最新新闻,必填:在布局中定义了false 并且除了两个之外的所有视图都具有相同调用的部分RenderPartial(“ShowLatestNews”)
有更好的方法吗?即遵循DRY原则 - 在一个地方定义并隐藏/不在这两个视图中使用它?
更新 -
目前,布局是基于用户从dbconfig中动态选择的 理想情况下,我们不希望根据控制器和动作组合来切换布局
答案 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中指定内容的部分。它不是评估真或假,只是存在属性。