如果不在母版页中放置导航菜单 - asp mvc

时间:2012-01-15 15:00:05

标签: asp.net-mvc asp.net-mvc-3 razor

我有一个剃刀布局,这个布局遍布我的所有视图 直到今天,导航菜单在这个布局中是(单独的控制器)。但现在这个菜单有动态数据。我无法在布局页面中保留它。
那么我应该在每个视图中渲染这个导航菜单,还是有其他方法只需要一次,只是将数据传递给它?

这是我在剃刀布局中渲染导航菜单的方法:

@Html.Action("CommonMenu", "Navigation", new { area = "CityPage" })

在CommonMenu视图中,我有主页链接:

<li> @Html.ActionLink("Home", "Index", "Home", new { area = "CityPage", city = ViewBag.City, countryCode = ViewBag.CountryCode }, null)

我用这个菜单打开一页。当我点击回家时,我希望回家的城市(如英国,伦敦)。

但我可以从这个页面转到其他城市(如CH,苏黎世) 现在我需要重新整理整个导航菜单 如果我用剃刀布局渲染菜单,我不知道我能做到吗? 的更新
这就是我从一个城市页面到另一个城市页面的方式:

@Html.ActionLink("Go To London", "Index", "Home", new { area = "CityPage", city = "London", countryCode = "UK" }, null)

当我点击此链接mu&#39; CommonMenu&#39;行动被称为:

[ChildActionOnly]
        public PartialViewResult CommonMenu(string countryCode, string city)
        {...

但是出于某种原因,这个动作被称为几次:
第一次两个值都为空。
第二次价值是英国,伦敦 第三次是空的。
这是我打破的页面。

2 个答案:

答案 0 :(得分:1)

使用子动作进行布局导航,您在正确的轨道上。但是,为什么不强烈键入它而不是使用viewbag?

<强>视图模型:

public class CommonMenuLinkModel
{
    public string Text { get; set; }
    public string Area { get; set; }
    public string Controller { get; set; }
    public string Action { get; set; }
    public string City { get; set; }
    public string CountryCode { get; set; }
}

查看:

@model IEnumerable<CommonMenuLinkModel>
<ul>
@foreach(var link in Model)
{
    <li>@Html.ActionLink(link.Text, link.Controller, link.Action, 
        new {area = link.Area, city = link.City, countryCode = link.CountryCode}, 
        null)</li>
}
</ul>

在你的控制器中,不是把东西放在ViewBag中,而是将它们放在一个强类型的CommonMenuLinkModel集合中,然后将它传递给局部视图。

注意:您可以将此作为从布局调用的子操作。

<强>更新

我想重申我在one of your questions that I previously answered中所说的话。使用T4MVC,您可以生成如下操作链接:

<li>@Html.ActionLink(link.Text, 
    MVC.CityPage.Home.Index(link.CountryCode, link.City))</li>

甚至更好,就像这样,所以你可以更清楚地控制HTML:

<a href="@Url.Action(MVC.CityPage.Home.Index(link.CountryCode, link.City))">
    @link.Text</a>

答案 1 :(得分:0)

您可以在布局中使用RenderAction。它将从控制器调用一个动作并使用您想要的动态方式渲染它:

@{ Html.RenderAction("Index", "NavigationMenu"); }

在这种情况下,它将呈现控制器“NavigationMenu”的动作“索引”的结果