MVC 3自定义URL路由

时间:2012-01-26 09:05:13

标签: asp.net-mvc-3 routing asp.net-mvc-routing

我想创建一个自定义路由,因为默认的mvc创建这样的路由:

domain.com/deals/detail/5

但在我的情况下,我想为它创建一个自定义路线:

domain.com/delicious-food-in-paris

因此它必须通过向其传递id值5来查找交易控制器的详细操作。

我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

此路由将所有一个段url映射到deals控制器的detail方法,并将一个名为dealName的字符串参数传递给它:

routes.MapRoute(
        null,
        "{dealName}",
        new { controller = "deals", action = "detail" }            
    );

但正如AdamD所说,你应该将该路线注册为你设置中的最后一条路线,因为它会捕获所有只有一段的网址。

使用这种方法,您必须按名称查找您的交易,这可能是不可接受的。如此多的应用程序使用混合方法,并在URL中包含名称和ID,如下所示:

domain.com/deals/5-HereComesTheLongName

然后你可以使用这样的路线来获取id和可选的名称:

routes.MapRoute(
        null,
        "{id}-{dealName}",
        new { 
          controller = "deals", 
          action = "detail", 
          dealName = UrlParameter.Optional
        }
    );

答案 1 :(得分:0)

您可以通过在Global.asax RegisterRoutes函数中定义自定义路由来完成此操作。您需要在默认路由之后添加此路由,因此如果默认控制器操作ID模式失败,它将尝试执行最终路由。

一个例子是使用以下内容:

        routes.MapRoute(
            "RouteName",
            "/{uri}", //this is www.domain.com/{uri}
            new { controller = "Controller", action = "ByUri" },
            new { uri = @"[a-z\-0-9]+" } //parameter regex can be tailored here
        );

注册此路由后,您可以添加新的自定义控制器来处理这些路由,添加将处理此操作的操作并接受字符串作为参数。

在这个新操作中,您可以进行数据库查找或返回视图的一些硬编码的valide路由。