免责声明:我仍然是一个新手,我正在维护一个由别人做的大项目,并且没有什么文档。所以我可能遗漏了一些明显的东西。
是这样的:我的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,它将只应用于当前请求,其他用户不会看到它。