【问题标题】:In ASP.Net MVC routing, how can you route 2 different paths that look the same, but have different types?在 ASP.Net MVC 路由中,如何路由 2 条看起来相同但类型不同的不同路径?
【发布时间】:2011-08-22 15:19:06
【问题描述】:

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

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?

【问题讨论】:

  • 当然你意识到你可以在你的控制器中区分不同的命名方式,对吧?但这并不能回答您的问题,我也对答案感兴趣
  • 是的,我想我做过,虽然我不能说我曾经使用过它。我不确定这会如何影响这个问题。

标签: asp.net-mvc routes


【解决方案1】:

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

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(只接受数字)。如果第一个路由不匹配,就会去第二个。

【讨论】:

  • 这就是我所需要的。谢谢。
【解决方案2】:

使用这样的东西:

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

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

请记住,路线是从上到下检查的,并在第一次匹配时停止。

【讨论】:

    【解决方案3】:

    我假设您已经为您的 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
    );
    

    【讨论】:

      【解决方案4】:

      在某些情况下,这可以通过路由约束来实现。一个常见的场景是我的 domain.com/482 的行为方式与我的 domain.com/products/details/482 相同,您不希望 482 匹配为控制器,而是匹配为产品 ID。

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

      见:http://www.asp.net/mvc/tutorials/creating-a-route-constraint-cs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-28
        • 2010-09-09
        • 2018-10-20
        • 1970-01-01
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多