面包屑没有显示出文化变化

时间:2016-06-30 15:48:09

标签: asp.net-mvc mvcsitemapprovider

免责声明:我仍然是一名新手,而且我正在维护一个由其他人提供的很少文档的大项目。所以我可能会遗漏一些明显的东西。

这里是: 我的网络应用程序可以通过2个dns名称访问,“www.website.com”和“www.siteweb.com”一个用英语访问,另一个用法语访问。

曾经有一个双语启动页面提示语言,但由于我们有2个网址,我不得不删除启动页面,并使用与用于访问的URL对应的语言自动重定向到主页面它

这是位于已解散的启动页面(index.vbhtml)上的重定向代码:

@Code
If Request.ServerVariables("SERVER_NAME").Contains(ConfigurationManager.AppSettings("SiteDNSnameEN")) Then
    Response.Redirect(Url.Action("SetLanguage", Resources.ResourceURL.CONTROLLER_LANGUAGE, New With {.pCulture = "en-CA", .pReturnURL = "/Home"}))
ElseIf Request.ServerVariables("SERVER_NAME").Contains(ConfigurationManager.AppSettings("SiteDNSnameFR")) Then
    Response.Redirect(Url.Action("SetLanguage", Resources.ResourceURL.CONTROLLER_LANGUAGE, New With {.pCulture = "fr-CA", .pReturnURL = "/Accueil"}))
End If 
@EndCode

当在法语“Home”页面上时,当我使用语言切换按钮时,面包屑工作正常,该按钮指的是转换网址并触发“SetLanguage”的控制器,它基本上设置CurrentCulture和CurrentUICulture并重新加载pReturnURL。一切都得到了正确的翻译,没有问题。

但是如果我使用英文网址(或假冒使用它,因为在dev中它只是localhost),会显示面包屑,但是当我按下语言切换按钮时,不会显示面包屑。 我最好的猜测是MVCSiteMapProvider仍然在寻找英文资源,因为面包屑会显示在那个恰好具有法语或英语相同路径的页面上。

我已经玩过globac.asax的路由和重定向,但我只能修复一种语言并搞定另一种语言。

我确信现在有一个小小的解决方案已经躲过了我很长一段时间。在某个地方,文化变革似乎无法完成。我对动作“SetLanguage”进行了故障排除,它始终显示出预期的文化。可能不是这样,但我认为MVCSiteMapProvider并不总是出于某种原因。

以下是我修改过的Global.asax部分:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
    routes.MapRoute( _
        "Splash", _
        "", _
        New With {.controller = "Root", .action = "Index"} _
    )

    routes.MapTranslatedRoute( _
        "TranslatedRoute", _
        "{controller}/{action}/{id}", _
        New With {.controller = "Home", .action = "Index", .id = ""}, _
        New With {.controller = translationProvider, .action = translationProvider}, _
        False _
    )

    Dim controllerHomeEN = Resources.ResourceURL.ResourceManager.GetString("CONTROLLER_HOME", New CultureInfo(WebHelper.CONST_CURRENT_CULTURE_EN))
    Dim actionIndexEN = Resources.ResourceURL.ResourceManager.GetString("ACTION_INDEX", New CultureInfo(WebHelper.CONST_CURRENT_CULTURE_EN))


    routes.MapRoute( _
        "Default", _
        "{controller}/{action}/{id}", _
        New With {.controller = controllerHomeEN, .action = actionIndexEN, .id = UrlParameter.Optional} _
    )

1 个答案:

答案 0 :(得分:0)

通常,当面包屑消失时,意味着您没有考虑节点中所有请求的路由值。例如,如果你有一个"文化"从路线传递的路线值并且您未在preservedRouteParameters设置该路线值,则该节点不会与该请求匹配。

最好的猜测是,您正在使用导致节点不匹配的translationProvider。但既然你还没有发布代码,我只能想象一下。

请注意,如果您写入某个地方的SiteMapNode.Title属性,那么该值可能会流失到其他请求。 MvcSiteMapProvider v3.x not threadsafe ,因此如果一个请求更新了SiteMap的缓存节点中的值,则在缓存过期之前,它们将在所有其他请求中可见(或直到下一个请求覆盖它)。

请注意,动态节点提供程序不是按请求动态调用。它们用于创建基于动态数据的缓存(共享)节点。因此,您应该不要在动态节点提供程序中放置任何每个请求条件(例如本地化)。

MSDN上的How to Localize Site-Map Data文档显示了在MvcSiteMapProvider v3.x中配置本地化的正确方法。请注意,使用默认文件构建设置时,MVC中有issue with deployment个全局资源。

另见:

  

对于MvcSiteMapProvider v4.x,you have other options如果你去upgrade。此外,MvcSiteMapProvider v4.x 是线程安全的 - 如果您在请求中更新诸如Title之类的值,它将仅应用于当前请求,而其他用户将不会看到它。