在ASP.Net MVC中,我想要两条不同的路线:
和
在Foo类中,我有2个返回ActionResult的方法
public ActionResult DetailsById(int id)
{
. . . some code
}
和
public ActionResult DetailsByName(string name)
{
. . . some code
}
如何设置2个路由,以便如果参数为int,则转到DetailsById,否则转到DetailsByName?
答案 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