在ASP.Net MVC路由中,如何路由2个看起来相同但具有不同类型的不同路径?

时间:2011-08-22 15:19:07

标签: asp.net-mvc routes

在ASP.Net MVC中,我想要两条不同的路线:

http://mysite.com/foo/12345

http://mysite.com/foo/bar

在Foo类中,我有2个返回ActionResult的方法

public ActionResult DetailsById(int id)
{
. . . some code
}

public ActionResult DetailsByName(string name)
{
. . . some code
}

如何设置2个路由,以便如果参数为int,则转到DetailsById,否则转到DetailsByName?

4 个答案:

答案 0 :(得分:12)

您可以对第一条路线使用路线约束。

routes.MapRoute("DetailsById",
                "foo/{id}",
                new { controller = "foo", action = "DetailsById" },
                new { id = @"\d+" } // Parameter constraints
            );

routes.MapRoute("DetailsByName",
                "foo/{id}",
                new { controller = "foo", action = "DetailsByName" }
            );

第一条路线只接受与正则表达式匹配的ID(仅接受数字)。如果它与第一条路线不匹配,它将转到第二条路线。

答案 1 :(得分:0)

使用类似的东西:

routes.MapRoute(
    "DetailsById",
    "Foo/{Id}",
    new {controller="Foo", action="DetailsById"},
    new {Id= @"\d+" }
);

routes.MapRoute(
    "DetailsByName",
    "Foo/{Name}",
    new {controller="Foo", action="DetailsByName"}
);

请记住,路线从上到下进行检查,并在第一场比赛时停止。

答案 2 :(得分:0)

我假设您已经为id参数设置了默认路由。 您需要做的唯一事情是在global.asax.cs中添加地图路线:

routes.MapRoute(
    "Foo_DetailsByName",// Route name
    "Foo/DetailsByName/{name}",// URL with parameters
    new { controller = "Foo", action = "DetailsByName", name = String.Empty  }  // Parameter defaults
);

答案 3 :(得分:0)

在某些情况下,这可以通过路线约束来实现。一种常见的方案是让我的domain.com/482的行为与我的domain.com/products/details/482相同,您不希望482与控制器匹配,而是作为产品ID。< / p>

路由约束是正则表达式,因此虽然您可以使用正则表达式来匹配路由模式,但实际上并不是基于数据类型进行匹配。

请参阅:http://www.asp.net/mvc/tutorials/creating-a-route-constraint-cs