0

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

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

更新 -

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

4

2 回答 2

1

这个问题确实有很多不同的方向,其中很多路径都是由当前的设计决定的。

而其他的是剪切和粘贴解决方案


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

管理页面

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

常规页面

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

但是现在让我们说你/我/谁真的只是希望这些页面与主布局分开,但需要它们根据某些信息(例如管理员、VIP 标签)略有不同,奇怪的想法在这里改变了一点,做我们希望控制器决定要做什么,或者视图是否已经拥有这些信息......理想情况下,数据可以放在 ViewModel 或 ViewBag 或 Session 数据中 - 再次取决于:)

按用户 - 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视图。

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

于 2013-05-23T00:07:45.453 回答
0

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

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

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

ViewBag.HideSection = true;

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

于 2013-05-22T18:37:35.967 回答