【问题标题】:MVC 5 show Partial-View in Layout only on Home IndexMVC 5 仅在主索引上显示布局中的部分视图
【发布时间】:2014-09-19 20:08:08
【问题描述】:

我在我的网站上使用侧边栏,其中包含来自我的数据库的统计信息以及链接和其他文本等静态数据。

在我的_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);
}

它就像一个魅力,但我不需要所有视图的统计信息,只需要/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");
    }
}

我知道我需要创建两个局部视图,但一个是静态的,所以我不会长时间编辑它:)。 经测试,有效。

【问题讨论】:

  • 把部分放在你的主页索引上,而不是你的布局上。
  • 如果它被隐藏在 HTML 标记中的某个位置,而在 Home/Index 视图中将变得无法访问,那将是不可能的。

标签: c# razor asp.net-mvc-5 partial-views


【解决方案1】:

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

ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME"

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

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

更新:

_Layout.cshtml:

<...>
@Html.RenderSection("sidebar", false)
<...>

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

所以你的主页看起来像

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

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

所有其他页面看起来像

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

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

如果您不想重复使用“SidebarNoStatPV”,您可以使用嵌套布局:

_NoStatLayout.cshtml

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

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

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

【讨论】:

  • 感谢您的提议。我需要所有页面上的侧边栏,只是侧边栏中的一些数据不需要出现在所有页面上。
  • 这是个好主意,而且我大部分时间都不会考虑这样做。感谢您的提示。
  • 我们已经在我们的项目中使用了多个_Layout,我不想创建另一个。我认为您的解决方案也更“干净”。我们的网站是一个 Intranet,不会在 Internet 上,所以第一个解决方案不会有问题。我为我的其他项目保留你的:)
【解决方案2】:

如果您想在_Layout 页面中保留调用动作的代码,那么您只需要在生成页面时获取有关正在调用的动作的信息。将以下内容添加到 _Layout 的顶部:

var isHome = ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME";
var isIndex = ViewContext.RouteData.Values["action"].ToString().ToUpper() == "INDEX";

然后在 _Layout 中包装您的调用以在任何您需要的地方生成局部视图:

if (isHome && isIndex) {
    Html.RenderAction("SidebarPV", "Home");
}

【讨论】:

  • 不能这样做,因为我想“评论”我在布局中调用的部分视图代码本身的一部分。我试图将此代码放在部分视图中,但不起作用。也许,使用这段代码,我可以在布局中调用两个不同的 Partial-Views……我会尝试这种方式。
  • 第一篇文章已编辑,解决方案就在这里。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
相关资源
最近更新 更多