【问题标题】:Breadcrumb not showing on culture change面包屑未显示在文化变革中
【发布时间】:2016-06-30 15:48:08
【问题描述】:

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

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

曾经有一个双语启动页面提示输入语言,但由于我们有 2 个 url,我不得不删除启动页面并自动重定向到与用于访问的 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

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

但是,如果我使用英文 URL(或假使用它,因为在 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} _
    )

【问题讨论】:

    标签: asp.net-mvc mvcsitemapprovider


    【解决方案1】:

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

    最好的猜测是你正在用你的translationProvider 做某事导致节点不匹配。但是由于您没有发布代码,我只能想象什么。

    请注意,如果您写入 SiteMapNode.Title 属性在您不应该出现的地方,则该值可能会溢出到其他请求。 MvcSiteMapProvider v3.x 不是线程安全的,所以如果一个请求更新了 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 之类的值,它将仅适用于当前请求,其他用户不会看到它。

    【讨论】:

    • 更新到 v4 解决了我的问题。我之前在安装它时遇到了麻烦,并且通常会回滚,因为我不是这样才能解决它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多