面包屑未显示文化变化

Breadcrumb not showing on culture change

免责声明:我还是个菜鸟,我正在维护一个由其他人制作的大型项目,但文档很少。所以我可能遗漏了一些明显的东西。

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

曾经有一个双语启动页面提示输入语言,但由于我们有 2 urls,我不得不删除启动页面并自动重定向到对应语言的主页用于访问它的 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" 页面上,当我使用语言切换按钮时面包屑导航工作正常,它指的是翻译 url 并触发 "SetLanguage" 的控制器,基本上设置 CurrentCulture 和 CurrentUICulture 并重新加载 pReturnURL。一切都得到正确翻译,没有问题。

但是如果我使用英语 URL(或者假装使用它,因为在开发中它只是本地主机),会显示面包屑,但是当我按下语言切换按钮时,面包屑不会显示显示。 我最好的猜测是 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} _
    )

通常,面包屑消失意味着您没有考虑节点中所有请求的路由值。例如,如果您有一个从路由传递的 "culture" 路由值,但您没有在 preservedRouteParameters 中设置它,那么该节点将不匹配请求。

最好的猜测是您正在对 translationProvider 执行某些操作,导致节点不匹配。但是既然你还没有贴出代码,我只能想象一下。

请注意,如果您正在 写入 SiteMapNode.Title 属性 某个您不应该出现的地方,该值可能会转移到其他请求。 MvcSiteMapProvider v3.x 是 不是线程安全的 ,因此如果一个请求更新了 SiteMap 缓存节点中的值,它们将在所有其他请求中可见,直到缓存过期(或直到下一个请求覆盖它)。

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

使用默认文件构建设置时 MVC 中的 How to Localize Site-Map Data document on MSDN shows the correct way to configure localization in MvcSiteMapProvider v3.x. Do note that there is an issue with deployment 全局资源。

另见:

For MvcSiteMapProvider v4.x, you have other options if you were to upgrade. Also, MvcSiteMapProvider v4.x is threadsafe - if you update a value such as Title within the request, it will apply only to the current request and no other user will see it.