首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 5只在主页索引上显示局部视图

MVC 5只在主页索引上显示局部视图
EN

Stack Overflow用户
提问于 2014-07-28 15:24:39
回答 2查看 5K关注 0票数 1

我使用我的网站上的一个侧边栏从我的数据库和静态数据,如链接和其他文本的统计。

在我的_Layout.cshtml中,我使用Html.RenderAction("SidebarPV", "Home");调用侧栏。

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

代码语言:javascript
复制
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);
}

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

因此,我想‘评论’的统计生成时,ser不在网站的索引。

谢谢你的建议。

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

我在我的_Layout上写的

代码语言:javascript
复制
@{
    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");
    }
}

我知道我需要创建两个部分视图,但是其中一个视图是静态的,所以我不会在很长时间内编辑它:)。测试过了,效果很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-28 15:28:44

如果您希望保留代码来调用_Layout页面中的操作,那么您只需要获得生成页面时调用什么操作的信息。将以下内容添加到您的_Layout顶部

代码语言:javascript
复制
var isHome = ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME";
var isIndex = ViewContext.RouteData.Values["action"].ToString().ToUpper() == "INDEX";

然后将调用包装起来,在_Layout中任何需要的地方生成部分视图,如下所示:

代码语言:javascript
复制
if (isHome && isIndex) {
    Html.RenderAction("SidebarPV", "Home");
}
票数 4
EN

Stack Overflow用户

发布于 2014-07-29 07:10:01

还有另一个解决办法。至于我,我讨厌这样的事情

代码语言:javascript
复制
ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME"

它必须使用神奇的字符串,甚至不是const,只是运行时字符串。它可能预先提供一些问题。如果你在另一页上需要它呢?

我建议您使用嵌套布局。您可以用节创建_Layout

更新:

_Layout.cshtml:

代码语言:javascript
复制
<...>
@Html.RenderSection("sidebar", false)
<...>

然后,在您的主页上,您可以只使用_SidebarLayout而不是_Layout。每当您需要任何页面上的侧边栏时,您都可以这样做。

所以你的主页看起来就像

代码语言:javascript
复制
@{
    Layout = "~/Views/_Layout.cshtml";
}

@section sidebar {
    @Html.RenderAction("SidebarPV", "Home")
}

所有其他页面看起来就像

代码语言:javascript
复制
@{
    Layout = "~/Views/_Layout.cshtml";
}

@section sidebar {
    @Html.RenderAction("SidebarNoStatPV", "Home")
}

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

_NoStatLayout.cshtml

代码语言:javascript
复制
@{
    Layout = "~/Views/_Layout.cshtml";
}
@section sidebar {
    @Html.RenderAction("SidebarNoStatPV", "Home")
}

并将其用作除主页之外的任何页面的布局。如果您需要为不同的页面扩展附带信息的侧栏,您可以将@Html.RenderSection(“侧栏”,false)放在_NoStatLayout.cshtml中的侧栏部分中。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24998604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档