我有Home controller和Details动作,它接收到int id参数。 我希望地图“/”url到Home controller,Details action,id = 1。 另外,我希望地图网址如“/ st15”到Home controller,Details action,id = 15。
所以我写了以下属性
[Route("~/{id:int:min(1):max(1)=1}")]
[Route("st{id:int:min(2)}")]
public ActionResult Details(int id)
{...}
问题是url“/ 1”也映射到此操作,但我需要404
答案 0 :(得分:2)
我建议利用在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匹配到这两个指定的路由。由于“默认”路线在其网址定义中没有任何其他参数,因此对“/ 1”的调用与路线不匹配,您将获得404。
如果您使用了空白项目,添加RouteConfig文件是一件小事。只需添加一个RouteConfig.cs文件并定义该类以包含我列出的RegisterRoutes方法,然后在Global.asax文件的Application_Start函数中添加一行
RouteConfig.RegisterRoutes(RouteTable.Routes);
你会很高兴。
(适用EDIT)强>
我不确定是否仍然存在冲突,但您可以通过简单地添加
将属性路由与标准路由范例相结合routes.MapMvcAttributeRoutes();
到您的RegisterRoutes函数,在IgnoreRoute调用之后,应用程序将始终首先遵循您的Route属性,然后检查已定义的路由。
但是,既然您已经表示要完全避免使用标准路由方法,那么您可以简单地定义属性以采用以下路由:
[Route("~/")]
[Route("st{id:int:min(2)}")]
public ActionResult Details (int id = "1")
{...}
设置id参数的默认值,避免尝试处理属性本身的大小写。由于您在第二个Route属性中为{id}参数定义了最小值,因此您不必担心“/ st”尝试路由到该操作的情况。它不会与任何已定义的路线匹配,404也是如此。