我想创建一个自定义路由,因为默认的mvc创建这样的路由:
domain.com/deals/detail/5
但在我的情况下,我想为它创建一个自定义路线:
domain.com/delicious-food-in-paris
因此它必须通过向其传递id值5来查找交易控制器的详细操作。
我该怎么做?
由于
答案 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路由。