【发布时间】:2016-06-19 13:46:20
【问题描述】:
我正在创建一个应该支持多种语言的 MVC5 网站。应用程序的结构很复杂,所以我只使用属性路由。 RouteConfig.cs 很简单:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
我想通过在站点名称后添加语言标识符来将语言信息保留在 URL 中。对于默认语言英语,URL 应保持“干净”。下面是一个例子:
http://test.com/foo/1/bar/2
http://test.com/de/foo/1/bar/2
我的第一次尝试是为每个控制器使用两个RoutePrefix 属性:
[RoutePrefix("foo")]
[RoutePrefix("{lang}/foo")]
但 MVC 不允许一个控制器使用多个 RoutePrefix 属性。
所以现在我根本不使用RoutePrefix 属性,并为每个控制器操作指定完整路由:
[Route("foo/{a}/bar/{b}")]
[Route("{lang}/foo/{a}/bar/{b}")]
有没有更好的方法来处理lang 路由?理想情况下,我只想在一个地方指定,而不是为每个控制器指定。
PS。我通过在自定义过滤器中解析语言路由来设置当前线程文化。
【问题讨论】:
-
看看this answer。对于属性路由,请阅读 cmets。
-
所以你的建议只是为每个动作添加两条路线?还是我错过了什么?
-
您可以 1) 每个操作添加 2 条路由 2) 使用常规路由或 3) 分析
MapMvcAttributeRoutes的源并制作一个类似的方法,为每个Route属性注册一个本地化路由(是确保在MapMvcAttributeRoutes之前调用您的自定义方法,以将路由以正确的顺序放入 RouteTable)。 -
我用第三个选项的例子更新了我的other answer。
-
您是否尝试过执行属性路由的代码?当调用方法
MapMvcAttributeRoutes()来创建路由副本时,第一条路由的类型为RouteCollectionRoute,不能转换为Route。即使我忽略了这一点,这些添加的本地化路线也不起作用。
标签: c# asp.net asp.net-mvc routing attributerouting