asp.net mvC语言 Breadcrumb不显示文化变化



免责声明:我仍然是一个新手,我正在维护一个由别人做的大项目,并且没有什么文档。所以我可能遗漏了一些明显的东西。

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

曾经有一个双语提示页面提示语言,但由于我们有两个URL,我不得不取消提示页面,并自动重定向到与用于访问它的URL对应的语言的主页。

这是位于已失效的splash页面(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的部分。

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} _
    )

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

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

请注意,如果在不应该的地方写入 SiteMapNode.Title属性,则该值可能会溢出到其他请求。MvcSiteMapProvider v3。不是线程安全的,所以如果一个请求更新了SiteMap缓存节点中的值,那么在所有其他请求中都可以看到这些值,直到缓存过期(或者直到下一个请求覆盖它)。

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

MSDN上的如何本地化站点地图数据文档显示了在MvcSiteMapProvider v3.x中配置本地化的正确方法。请注意,当使用默认的文件构建设置时,在MVC中部署全局资源存在一个问题。

也看到:

  • SiteMapPath在更改文化#359时为空
  • 本地化站点地图在切换文化#52后无法工作
  • 有时不显示面包屑。# 331
  • 可选路由参数#387

对于MvcSiteMapProvider v4。X,如果你要升级,你有其他选择。还有MvcSiteMapProvider v4。x 是线程安全的 -如果你在请求中更新一个值,比如Title,它将只应用于当前请求,其他用户不会看到它。

最新更新