我正在使用MVC3(使用Razor语法)。
这就是我想要的:我的shared/_Layout.cshtml
的一部分,它在ViewBag中查找List<RelatedLinks>
,如果它在那里,它会在页面工具栏中呈现相关链接的列表(不出所料)。我的一些页面将填充此集合,有些不会。当我从控制器中填充袋子时,它可以很好地工作。
然而,控制器似乎不是定义它们的正确位置,它们特定于视图并且它们感觉像导航逻辑 - 所以我想在视图标记中定义它们。
我已尝试将其添加到视图中的ViewBag
,但似乎无效。即使我在呈现链接的区域之前的_Layout.cshtml
上声明了一个部分,该集合似乎是空的。要么我做错了,要么他们不允许我从视图中填充ViewBag
(这是有道理的)。
我的问题归结为:我希望我的页面在他们想要呈现该部分时向_Layout.cshtml
发出信号,并提供链接列表。我不希望我的子页面担心我们如何填充或绘制列表 - 我只希望它定义列表中的内容。有任何想法吗?我已经尝试了很多东西(HtmlHelpers,子类控制器等),但我想我错过了一些明显的东西。
答案 0 :(得分:2)
为什么不创建局部视图而不是让_Layout.cshtml
渲染链接?
在_Layout中,添加一个可选部分
@RenderSection("RelatedLinks", false)
在您看来,
// Build your list of links
@section RelatedLinks {
@Html.Partial("Navigation", YourLinks)
}
您的视图可能会担心填充列表,而您的部分可以处理实际渲染。
答案 1 :(得分:1)
这样的事应该可以正常工作:
_Layout.cshtml:
if(IsSectionDefined("Links")){
@RenderSection("Links");
@foreach(var link in ViewBag.Links)
{
<a href="@link.href">@link.text</a>
}
}
MyView.cshtml:
@section Links{
@{
ViewBag.Links = new List { new {href="stackoverflow.com", text = "Stackoverflow"}};
}
}
答案 2 :(得分:0)
如果相关链接列表特定于视图,那么您应该将其视为导航逻辑而不是应用程序逻辑。 “硬编码”视图中的链接列表似乎是正确的方法。
但是,您肯定希望将呈现链接列表的逻辑与链接本身列表(数据)分开。局部视图应该适用于此。只需定义一个接受相关链接列表的部分(可能以页面标题的形式加上原始URL,路由或任何适合您的路径)。
在要显示相关链接列表的每个视图上,定义一个列表并将其传递给部分以进行渲染:
@{
var relatedLinks = new Dictionary<string, string>() {
{ "Link one", "/foo" },
{ "Link two", "/foo" }
};
}
@Html.Partial("RelatedLinks", relatedLinks)
<ul>
@foreach(var link in model) {
<li>@Html.Link(model.Key, model.Value)</li>
}
</ul>
您可以将所有这些放在@Section
中,并告诉_Layout.cs
仅在您的视图中实际定义了此类部分时,才会在页面上呈现“相关链接”部分。
@Section Links {
@{
var relatedLinks = new Dictionary<string, string>() {
{ "Link one", "/foo" },
{ "Link two", "/foo" }
};
}
@Html.Partial("RelatedLinks", relatedLinks)
}
@RenderSection("Links", required: false); // Optional section