我有一个剃刀布局,这个布局遍布我的所有视图
直到今天,导航菜单在这个布局中是(单独的控制器)。但现在这个菜单有动态数据。我无法在布局页面中保留它。
那么我应该在每个视图中渲染这个导航菜单,还是有其他方法只需要一次,只是将数据传递给它?
这是我在剃刀布局中渲染导航菜单的方法:
@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)
{...
但是出于某种原因,这个动作被称为几次:
第一次两个值都为空。
第二次价值是英国,伦敦
第三次是空的。
这是我打破的页面。
答案 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”的动作“索引”的结果