【问题标题】:Multilanguage menu for Mvc.sitemap with language in an UrlMvc.sitemap 的多语言菜单,带有 URL 中的语言
【发布时间】:2014-05-14 12:55:02
【问题描述】:

我的路线:

"{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>
    }
  }
}

一切只适用于默认语言,适用于所有其他 node.IsInCurrentPath => false。 看来我需要覆盖它。有人可以建议如何做到这一点吗?有没有其他方法可以解决问题?或者也许我需要以某种方式分配父母?但它适用于默认语言。

【问题讨论】:

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


    【解决方案1】:

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

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

    我怀疑默认语言“工作”的原因是您在路由中设置了默认的lang 参数。但从技术上讲,它仍然无法与当前 URL 的路由匹配,因为您没有平衡等式的两边。您的值如下所示:

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

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

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

    这将强制与 lang 参数的任何值匹配。如果所有其他键和值也都匹配,则 CurrentNode 属性的值将不为空,这对于使 SiteMapPath 和菜单的许多功能正常工作很重要。您可以通过使用preservedRouteParameters 或为每个路由值组合配置单独的节点来平衡账目,但在使用区域、控制器和操作以外的路由值时必须始终考虑到这一点。

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

    【讨论】:

    • 太棒了!你延长了我的生命。
    猜你喜欢
    • 2016-12-15
    • 2012-03-21
    • 1970-01-01
    • 2023-03-22
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多