【问题标题】:Where to put navigation menu if not in master page - asp mvc如果不在母版页中,将导航菜单放在哪里 - asp mvc
【发布时间】:2023-03-19 11:33:01
【问题描述】:

我有一个剃须刀布局,这个布局分布在我的所有视图中。
直到今天,导航菜单还是(单独的控制器)在这个布局中。但是现在这个菜单有动态数据。而且我不能再将它保留在布局页面中。
那么我应该在每个视图中呈现这个导航菜单,还是有其他方法可以只制作一次并将数据传递给它?

这就是我在 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 'CommonMenu' 操作:

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

但由于某种原因,此操作被调用了几次:
第一次两个值都为空。
第二次价值是英国,伦敦。
第三次为空。
这会导致我的页面中断。

【问题讨论】:

  • 这个动态数据有什么问题?为什么你不能把它留在布局中?这是应该在每个视图上呈现的菜单的最佳位置。
  • 我更新了问题。
  • 我真的不明白问题出在哪里。为什么不能使用 Html.Action?
  • 我用更多信息更新问题。由于某种原因,我的菜单操作被调用了几次,而 lat 调用返回空值。
  • 您是说您的子操作被多次调用,但您没有显示有效调用此操作的代码(使用 Html.Action 助手)。所以在这种情况下帮助你会有点困难。

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


【解决方案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>

【讨论】:

  • 我只是临时使用 viewbag,我会更改它。但是我的问题菜单操作被调用了几次。这是我上次更新的问题。
  • 我无法通过查看您的代码来判断为什么该操作会被多次调用。可能是因为路由定义。您是否考虑过使用 T4MVC 来生成链接而不是魔术字符串? stackoverflow.com/a/8810526/304832
【解决方案2】:

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

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

在这种情况下,它将渲染控制器“NavigationMenu”的操作“Index”的结果

【讨论】:

  • 既然可以使用@Html.Action("Index", "Navigation"),为什么还要使用@{ RenderAction("Index", "Navigation"); }
  • RenderAction 直接渲染到响应中,Action 返回字符串。 RenderAction 更高效。
猜你喜欢
  • 2010-09-08
  • 2010-10-11
  • 1970-01-01
  • 2023-04-09
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多