免责声明:我仍然是一名新手,而且我正在维护一个由其他人提供的很少文档的大项目。所以我可能会遗漏一些明显的东西。
这里是: 我的网络应用程序可以通过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} _
)
答案 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之类的值,它将仅应用于当前请求,而其他用户将不会看到它。