我建议利用 VS2012 中使用默认 MVC 项目创建的 RouteConfig.cs 文件。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Details",
url: "/st{id}",
defaults: { controller = "Home", action = "Details", id = "1" }
);
routes.MapRoute(
name: "Default",
url: "/",
defaults: new { controller = "Home", action = "Details", id = "1" }
);
}
这将尝试按照您将它们添加到 RouteConfig 文件的顺序将 url 与这两个指定路由匹配。由于“默认”路由在其 URL 定义中没有任何其他参数,因此对“/1”的调用将与路由不匹配,您将得到 404。
如果您使用的是空白项目,添加 RouteConfig 文件是一件小事。只需添加一个 RouteConfig.cs 文件并定义类以包含我列出的 RegisterRoutes 方法,然后在 Global.asax 文件的 Application_Start 函数中,添加一行
RouteConfig.RegisterRoutes(RouteTable.Routes);
你会很高兴的。
(编辑)
我不确定是否仍然不会发生冲突,但是您可以通过简单的添加将属性路由与标准路由范式结合起来
routes.MapMvcAttributeRoutes();
在 IgnoreRoute 调用之后立即到您的 RegisterRoutes 函数,应用程序将始终首先遵循您的 Route 属性,然后检查定义的路由。
但是,由于您已表明您希望完全避免使用标准路由方法,您可以简单地定义属性以采用以下路由:
[Route("~/")]
[Route("st{id:int:min(2)}")]
public ActionResult Details (int id = "1")
{...}
为 id 参数设置默认值并避免尝试在属性本身中处理大小写。由于您在第二个 Route 属性中为 {id} 参数定义了最小值,因此您不必担心“/st”尝试路由到该操作的情况。它与任何一个定义的路由都不匹配,404 也是如此。