自定义路由生成URL时无法正确携带用户Culture值的问题
问题原因与解决方案
你的问题出在自定义路由的默认值配置方式上:你在culture-privacy路由的defaults参数里显式指定了culture = "en",这会导致路由生成URL时,强制使用这个默认值,而忽略当前请求路由数据中已有的culture值。
修正后的路由配置
将culture的默认值直接嵌入路由模板,而非放在defaults中:
endpoints.MapControllerRoute( name: "culture-privacy", pattern: "{culture=en}/h/p", // 默认值直接写在路由模板里 defaults: new { controller = "Home", action = "Privacy" }); endpoints.MapControllerRoute( name: "default-privacy", pattern: "h/p", defaults: new { controller = "Home", action = "Privacy" });
原理说明
当路由模板写成{culture=en}/h/p时:
- 如果当前请求没有传递
culture参数(比如访问http://localhost),路由会使用默认值en,生成/en/h/p(或者匹配到default-privacy路由生成/h/p,取决于路由匹配顺序); - 如果当前请求的路由数据中已经存在
culture值(比如访问http://localhost/fr),Url.ActionLink会自动复用这个值,生成正确的/fr/h/p链接。
额外优化建议
你配置了RouteDataRequestCultureProvider,其实可以移除自定义的CultureFilter——RouteDataRequestCultureProvider会自动从路由数据中读取culture并设置请求的当前文化,不需要手动通过过滤器修改线程文化。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

