Mvc.sitemap的多语言菜单,其中包含Url中的语言

时间:2014-05-14 12:55:03

标签: asp.net-mvc asp.net-mvc-4 url-routing asp.net-mvc-routing mvcsitemapprovider

我的路线:

"{lang}/{controller}/{action}/{id}"

{lang}这里是:en-US,de-DE等

一切正常,直到我想转换语言。当我切换语言时,我正在丢失部分菜单。

我的MenuHelperModel.chtml

@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models
<div class="hmenu">
  <ul class="tabs">
    @foreach (var node in Model.Nodes)
    { 
      <li>@Html.DisplayFor(m => node)</li>
    }
  </ul>
</div>
@foreach (var node in Model.Nodes)
{ 
  if (node.IsInCurrentPath)
  {
    if (node.Children.Any()) {
     //Left side menu
     <div class="vmenu" style="float: left;">
       <ul class="tabs">
          @foreach (var child in node.Children)
          { 
            <li><a href="@child.Url">@child.Description</a></li>
          }
        </ul>
      </div>
    }
  }
}

一切正常仅适用于默认语言,适用于所有其他节点.IsInCurrentPath =&gt;假。 看起来我需要覆盖它。有人可以建议怎么做吗?有没有其他方法可以解决这个问题?或者我可能需要以某种方式分配父母?但它适用于默认语言。

1 个答案:

答案 0 :(得分:2)

您只需要在lang参数上将其设置为force a match,这样它就会始终从当前请求的路由复制到节点的RouteValues字典中。

<mvcSiteMapNode title="Home" controller="Home" action="Index" preservedRouteParameters="lang">
    <mvcSiteMapNode title="About" controller="Home" action="About" preservedRouteParameters="lang"/>
</mvcSiteMapNode>

我怀疑它是&#34;工作&#34;对于默认语言,因为您在路线中设置了默认的lang参数。但从技术上讲,它仍然无法与当前网址的路线相匹配,因为您没有平衡等式的两边。您的值看起来像这样:

|-----------------------------------|-----------------------------------|
|         Current Request           |          SiteMap Node             |
|-----------------------------------|-----------------------------------|
|      Key       |      Value       |      Key       |      Value       |
|-----------------------------------|-----------------------------------|
| controller     | Home             | controller     | Home             |
| action         | Index            | action         | Index            |
| lang           | de-DE            |                |                  |
|-----------------------------------|-----------------------------------|

由于节点中缺少lang键和值,因此不匹配。使用适当的键添加savedRouteParameters会在比较它们之前将它们从当前请求复制出来:

|-----------------------------------|-----------------------------------|
|         Current Request           |          SiteMap Node             |
|-----------------------------------|-----------------------------------|
|      Key       |      Value       |      Key       |      Value       |
|-----------------------------------|-----------------------------------|
| controller     | Home             | controller     | Home             |
| action         | Index            | action         | Index            |
| lang           | de-DE            | lang           | de-DE            |
|-----------------------------------|-----------------------------------|

这会强制匹配lang参数的任何值。如果所有其他键和值也匹配,则CurrentNode属性的值不为null,这对于获取SiteMapPath和菜单的许多功能非常重要。您可以通过使用savedRouteParameters或为每个路径值组合配置单独的节点来平衡书籍,但在使用区域,控制器和操作之外的路径值时,必须始终考虑这一点。

另外,有关设置SiteMapNode属性的本地化的信息,请参阅this answer