MVC 5仅在Home Index上显示Layout中的Partial-View

Sae*_*see 1 c# partial-views razor asp.net-mvc-5

我在我的网站上使用侧边栏,其中包含来自我的数据库的统计数据和静态数据,如链接和其他文本.

在我_Layout.cshtml,我Html.RenderAction("SidebarPV", "Home");用来调用侧边栏.

侧边栏是使用ViewModel进行统计的部分视图. SidebarPV在我的HomeController喜欢中生成:

public ActionResult SidebarPV() {
    SidebarViewModel viewmodel = new SidebarViewModel();
    DateTime now = DateTime.Now;
    viewmodel.stat_data1 = db.Table1.Where(e => e.DateDeb <= now && e.DateFin >= now).Count();
    viewmodel.stat_data2 = db.Table2.Where(c => c.DateDeb <= now && c.DateFin >= now).Count();
    return PartialView("SidebarPV", viewmodel);
}
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力,但我不需要所有视图的统计数据,只有 /Home/Index

因此,当ser不在网站索引上时,我想"评论"统计数据生成.

谢谢你的建议.

编辑(解决方案,感谢krillgar):

我写的是我的 _Layout

@{
    var isHome = ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME";
    var isIndex = ViewContext.RouteData.Values["action"].ToString().ToUpper() == "INDEX";
    if (isHome && isIndex) {
        Html.RenderAction("SidebarPV", "Home");
    }
    else {
        Html.RenderAction("SidebarNoStatPV", "Home");
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我需要创建两个局部视图,但一个是静态的,所以我不会长时间编辑它:).测试,它的工作原理.

Vla*_*lin 5

还有另一种解决方案.至于我,我讨厌这样的事情

ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME"
Run Code Online (Sandbox Code Playgroud)

它必须使用魔术字符串,它甚至不是const,只是运行时字符串.它可能提前提供一些问题.如果你需要在另一个页面上怎么办?

我建议你使用嵌套布局.您可以使用section创建_Layout

更新:

_Layout.cshtml:

<...>
@Html.RenderSection("sidebar", false)
<...>
Run Code Online (Sandbox Code Playgroud)

然后在您的主页上,您可以使用_SidebarLayout而不是_Layout.无论何时你需要在任何页面上使用侧边栏,你都可以做同样的事情.

所以你的主页看起来像

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

@section sidebar {
    @Html.RenderAction("SidebarPV", "Home")
}
Run Code Online (Sandbox Code Playgroud)

所有其他页面看起来都像

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

@section sidebar {
    @Html.RenderAction("SidebarNoStatPV", "Home")
}
Run Code Online (Sandbox Code Playgroud)

如果你不想用这个"SidebarNoStatPV"重复自己,你可以使用嵌套布局:

_NoStatLayout.cshtml

@{
    Layout = "~/Views/_Layout.cshtml";
}
@section sidebar {
    @Html.RenderAction("SidebarNoStatPV", "Home")
}
Run Code Online (Sandbox Code Playgroud)

并将其用作任何页面的布局,但Home.如果您需要为不同的页面添加附加信息的侧栏,您可以将@ Html.RenderSection("sidebar",false)放在_NoStatLayout.cshtml的侧边栏部分中.

为什么我认为这是一个更好的选择?它适合SRP,因为只有主页应该负责它自己的唯一数据.