【问题标题】:MvcSiteMapProvider, DynamicNodeProviderBase and GlobalizationMvcSiteMapProvider、DynamicNodeProviderBase 和全球化
【发布时间】:2012-06-10 16:21:30
【问题描述】:

我有以下课程

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

如您所见,我有两个属性,“Nome”和“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缓存了结果,如何处理:

【问题讨论】:

    标签: internationalization asp.net-mvc-4 globalization mvcsitemapprovider


    【解决方案1】:

    是的,这是 MvcSiteMapProvider 的缺点之一。在一个项目中,我通过返回所有节点(每个本地化一个节点)并使用自定义 VisibilityProvider 仅显示正确的本地化来解决此问题。

    【讨论】:

      【解决方案2】:

      您需要使用 lang 参数创建一个额外的 Route:

          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="..." 参数,您需要设置inheritedRouteParameters="lang" 然后您可以从节点的RouteValues 属性中获取lang:

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

      就是这样!

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 2013-07-31
        相关资源
        最近更新 更多