我正在尝试在控制器名称
之后传递mvc中的参数我添加了
routes.MapRoute(
name: "Product",
url: "Product/{*id}",
defaults: new { controller = "Product", action = "Index", id = UrlParameter.Optional }
);
这不起作用
我也试过url: "Product/{id}",
但是,如果我删除它上面的行(这篇文章中的下面的行),它正在工作
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
答案 0 :(得分:3)
您注册路线的顺序很重要。使用匹配请求的第一个路由。如果我理解正确,你最初有:
routes.MapRoute(
name: "Default",
...
routes.MapRoute(
name: "Product",
默认路由非常通用,因为它首先被注册,所以您的所有请求都会被选中,从而有效地隐藏了产品路径。
注册路线的正确方法是从大多数特定路线开始,并在最后注册最通用的路线。所以在你的情况下应该颠倒过来:
routes.MapRoute(
name: "Product",
...
routes.MapRoute(
name: "Default",
答案 1 :(得分:1)
在这种情况下,制作" id"更有意义。参数a 必需 参数,而不是可选参数。你可能也不希望它成为一个slu(({*id}
)。这将有助于确保您的Product
路由与请求不匹配,路由框架将尝试列表中的下一个路由(在本例中为Default
)。
要确保在没有匹配时会错过,您还可以添加路线约束以确保" id"是数字,就像route constraint example on MSDN。
routes.MapRoute(
name: "Product",
url: "Product/{id}",
// id has no default value, which makes it required in order to match
defaults: new { controller = "Product", action = "Index" },
// (optional) adding a constraint will make sure the id is only digits
constraints: new { id = @"\d+" }
);
// You will only end up here if the above route does not match,
// so it is important that you ensure that it CAN miss.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);