C# MVC 5仅在主索引的布局中显示局部视图
我在我的网站上使用一个侧边栏,上面有我数据库中的统计数据以及链接和其他文本等静态数据 在我的C# MVC 5仅在主索引的布局中显示局部视图,c#,razor,asp.net-mvc-5,partial-views,C#,Razor,Asp.net Mvc 5,Partial Views,我在我的网站上使用一个侧边栏,上面有我数据库中的统计数据以及链接和其他文本等静态数据 在我的\u Layout.cshtml中,我使用Html.RenderAction(“SidebarPV”,“Home”)调用侧边栏 侧边栏是一个局部视图,使用统计信息的ViewModel。 SidebarPV在myHomeController中生成,如下所示: public ActionResult SidebarPV(){ SidebarViewModel viewmodel=新的SidebarViewMo
\u Layout.cshtml
中,我使用Html.RenderAction(“SidebarPV”,“Home”)
调用侧边栏
侧边栏是一个局部视图,使用统计信息的ViewModel。
SidebarPV
在myHomeController
中生成,如下所示:
public ActionResult SidebarPV(){
SidebarViewModel viewmodel=新的SidebarViewModel();
DateTime now=DateTime.now;
viewmodel.stat_data1=db.Table1.Where(e=>e.DateDeb=now).Count();
viewmodel.stat_data2=db.Table2.Where(c=>c.DateDeb=now.Count();
返回PartialView(“SidebarPV”,viewmodel);
}
它工作起来很有魅力,但我不需要所有视图的统计信息,只需要/Home/Index
因此,当ser不在网站索引上时,我想“评论”统计数据的生成
谢谢你的建议
编辑(解决方案,感谢):
我在我的\u布局中写了
@{
var isHome=ViewContext.RouteData.Values[“controller”].ToString().ToUpper()=“HOME”;
var isIndex=ViewContext.RouteData.Values[“action”].ToString().ToUpper()=“INDEX”;
如果(iHome&&iIndex){
渲染(“SidebarPV”,“Home”);
}
否则{
渲染(“SidebarNoStatPV”、“Home”);
}
}
我知道我需要创建两个局部视图,但其中一个是静态的,所以我很长时间不会编辑它:)。
经过测试,它可以工作。如果您想在\u布局
页面中保留调用操作的代码,那么您只需要获取生成页面时调用的操作的信息。将以下内容添加到\u布局的顶部
:
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");
}
如果希望在\u布局
页面中保留调用操作的代码,则只需获取生成页面时调用的操作的信息。将以下内容添加到\u布局的顶部
:
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");
}
还有另一个解决方案。至于我,我讨厌这样的事情
ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME"
它必须使用魔术字符串,它甚至不是常量,只是运行时字符串。它可能会提前提供一些问题。如果你需要它在另一页上怎么办
我建议您使用嵌套布局。您可以使用截面创建_布局
更新:
_Layout.cshtml:
<...>
@Html.RenderSection("sidebar", false)
<...>
所有其他页面看起来都是这样的
@{
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(“侧栏”,false)放在_NoStatLayout.cshtml的侧栏部分中
为什么我认为这是一个更好的选择?它符合SRP,因为只有主页应该负责自己的独特数据。还有另一种解决方案。至于我,我讨厌这样的事情
ViewContext.RouteData.Values["controller"].ToString().ToUpper() == "HOME"
它必须使用魔术字符串,它甚至不是常量,只是运行时字符串。它可能会提前提供一些问题。如果你需要它在另一页上怎么办
我建议您使用嵌套布局。您可以使用截面创建_布局
更新:
_Layout.cshtml:
<...>
@Html.RenderSection("sidebar", false)
<...>
所有其他页面看起来都是这样的
@{
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(“侧栏”,false)放在_NoStatLayout.cshtml的侧栏部分中
为什么我认为这是一个更好的选择?它符合SRP,因为只有主页才应该负责它自己的唯一数据。将部分放在主页索引上,而不是布局上。如果它将被隐藏在HTML标记中的某个地方,而HTML标记在主页/索引视图中将变得不可访问,则这是不可能的。将部分放在主页索引上,而不是布局上。如果是这样的话,这是不可能的将被隐藏在HTML标记中的某个地方,该标记在主视图/索引视图中变得不可访问。无法这样做,因为我想对布局中调用的部分视图代码本身的一部分进行“注释”。我试图将此代码放在局部视图中,但不起作用。也许,有了这段代码,我可以在布局中调用两个不同的局部视图。。。我会试试的。第一篇文章编辑后,解决方案就在这里。谢谢。不能这样做,因为我想“注释”布局中调用的部分视图代码本身的一部分。我试图将此代码放在局部视图中,但不起作用。也许,有了这段代码,我可以在布局中调用两个不同的局部视图。。。我会试试的。第一篇文章编辑后,解决方案就在这里。谢谢,谢谢你的建议。我需要所有页面上的侧边栏,只是侧边栏中的一些数据不需要出现在所有页面上。这是一个好主意,而不是我大多数时候考虑过的事情。谢谢你的提示。我们已经在我们的项目中使用了多个布局,我不希望创建其他布局。我认为你的解决方案也更“干净”。我们的网站是一个内部网,不会在互联网上,所以第一个解决方案不会是一个问题。我为我的其他项目保留您的建议:)谢谢您的建议。我需要所有页面上的侧边栏,只是侧边栏中的一些数据不需要出现在所有页面上。这是一个好主意,而不是我大多数时候考虑过的事情。谢谢你的提示。我们已经在我们的项目中使用了多个布局,我不希望创建其他布局。我认为你的解决方案也更“干净”。我们的网站是一个内部网,不会