0

我有下面的類MvcSiteMapProvider,DynamicNodeProviderBase與全球化

public class MenuVeiculo 
{ 
    public string Nome { get; set; } 
    public string NomeEn { get; set; } 
    public Guid ID { get; set; } 
} 

正如你所看到的,我有兩個屬性, 「諾姆」 和 「NomeEn。」每一個代表英文的名字和名字。

Mvc.sitemap

<mvcSiteMapNode key="MenuVeiculo" dynamicNodeProvider="Semep.Extensibilidade.SiteMap.MenuVeiculoDynamicNodeProvider, Semep" title="Menu veiculo" action="Index" controller="Rental"> 

MenuVeiculoDynamicNodeProvider.cs

public class MenuVeiculoDynamicNodeProvider : DynamicNodeProviderBase 
{ 
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection() 
    { 
     var context = DependencyResolver.Current.GetService<SemepContext>(); 
     var listDB = (from p in context.MenusVeiculo 
         select new 
            { 
             p.Nome, 
             p.ID 
            }); 

     const string keyFormat = "MenuVeiculo_{0}"; 
     foreach (var menu in listDB.ToList()) 
     { 
      var key = string.Format(keyFormat, menu.ID.ToString().ToUpper()); 
      var root = new DynamicNode(key, menu.Nome) 
          { 
           Title = menu.Nome 
           , 
           Key = key 
          }; 
      root.Attributes.Add("id", menu.ID.ToString()); 
      root.RouteValues.Add("id", menu.ID); 
      yield return root; 
     } 
    } 

    #endregion 
} 

問題

我的問題是,如何與多國語言和DynamicNodeProviderBase工作? 正如你所看到的,有兩個領域,我只顯示一個。 「Thread.CurrentThread.CurrentCulture」的問題是MvcSiteMapProvider緩存結果,如何處理:

回答

0

是的,這是MvcSiteMapProvider的缺點之一。在一個項目中,我通過返回所有節點解決了這個問題,每個節點都有一個本地化,並且使用自定義的VisibilityProvider僅顯示正確的本地化。

0

您需要郎參數創建一個額外的路線:

routes.MapRoute(
     name: "Default_lang", 
     url: "{lang}/{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     constraints: new { lang = @"^(en|ru)$" }, 
     namespaces: new[] { "PNSoft.WebSite.Controllers" } 
    ); 

然後,在你mvc.sitemap指定LANG =「...」爲根節點和子節點的參數,您需要set inheritedRouteParameters =「lang」,然後你可以從節點RouteValues屬性獲得lang:

 public override IEnumerable<MvcSiteMapProvider.DynamicNode> GetDynamicNodeCollection(MvcSiteMapProvider.ISiteMapNode node) 
     { 
      var lang = (string)node.RouteValues["lang"]; 
... 
     } 

那就是所有!