MVC3 - 在模板和视图之间进行通信

时间:2012-01-09 18:00:15

标签: c# asp.net-mvc-3

我正在使用MVC3(使用Razor语法)。

这就是我想要的:我的shared/_Layout.cshtml的一部分,它在ViewBag中查找List<RelatedLinks>,如果它在那里,它会在页面工具栏中呈现相关链接的列表(不出所料)。我的一些页面将填充此集合,有些不会。当我从控制器中填充袋子时,它可以很好地工作。

然而,控制器似乎不是定义它们的正确位置,它们特定于视图并且它们感觉像导航逻辑 - 所以我想在视图标记中定义它们。

我已尝试将其添加到视图中的ViewBag,但似乎无效。即使我在呈现链接的区域之前的_Layout.cshtml上声明了一个部分,该集合似乎是空的。要么我做错了,要么他们不允许我从视图中填充ViewBag(这是有道理的)。

我的问题归结为:我希望我的页面在他们想要呈现该部分时向_Layout.cshtml发出信号,并提供链接列表。我不希望我的子页面担心我们如何填充或绘制列表 - 我只希望它定义列表中的内容。有任何想法吗?我已经尝试了很多东西(HtmlHelpers,子类控制器等),但我想我错过了一些明显的东西。

3 个答案:

答案 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,路由或任何适合您的路径)。

在要显示相关链接列表的每个视图上,定义一个列表并将其传递给部分以进行渲染:

1。 MyView.cshtml

@{
    var relatedLinks = new Dictionary<string, string>() {
        { "Link one", "/foo" },
        { "Link two", "/foo" }
    };
}
@Html.Partial("RelatedLinks", relatedLinks)

1。 RelatedLinks.cshtml

<ul>
@foreach(var link in model) {
    <li>@Html.Link(model.Key, model.Value)</li>
}
</ul>

您可以将所有这些放在@Section中,并告诉_Layout.cs仅在您的视图中实际定义了此类部分时,才会在页面上呈现“相关链接”部分。

2。 MyView.cshtml

@Section Links {
    @{
        var relatedLinks = new Dictionary<string, string>() {
            { "Link one", "/foo" },
            { "Link two", "/foo" }
        };
    }
    @Html.Partial("RelatedLinks", relatedLinks)
}

2。 _Layout.cshtml

@RenderSection("Links", required: false); // Optional section