MVC路由:约束路由以匹配已识别的控制器名称

时间:2012-06-12 15:38:00

标签: routing asp.net-mvc-routing asp.net-mvc

我想定义一个带约束的路由,以便它只匹配已知的控制器名称。这是为了允许我为同一表单的其他URL定义回退路由。

具体做法是:

/User

应该转到用户控制器(存在)

的索引操作
/History

应该带我进入历史控制器(存在)

的索引操作
/es

由于不存在“es”控制器,应使用后备路由并带我进入Home控制器的Index操作,语言参数值为“es”。

我需要这个,因为我需要提供一个带有语言代码的特殊URL,以便以给定的语言启动应用程序。因此,现在需要区分路由中的有效控制器名称和语言名称。

如何实现RegisterRoutes来实现这一目标?非常感谢!

编辑:我意识到我可以为每个控制器定义一个特定的路由,这是可以的(我没有多个控制器)。但我想知道我是否可以依靠通用约束来实现这一点,这样我就不必定义单独的路径。

1 个答案:

答案 0 :(得分:3)

定义路线时,请使用“constraints”参数来处理此问题。

例如:

RouteTable.Routes.Add(new Route
{
    Url = "{controller}/{action}",
    Constraints = new { controller = "User|History" },
    Defaults = new { action = "Index" }
};

RouteTable.Routes.Add(new Route
{
    Url = "{languageCode}",
    Defaults = new { controller = "Home", action = "Index" }
};

首先评估添加的第一条路线。如果“控制器”的令牌与约束不匹配,则将评估添加的下一个路由并使用索引操作和参数languageCode中的语言标记解析到Home控制器。您可能还想为languageCode标记添加约束,以确保只匹配有效的语言。然后你可以添加第三条路线作为全能路线。

您也可以使用路由处理程序处理languageCode,正如我在博文Localization and MVC中所描述的那样。