在我的MVC应用程序中,我有以下路由配置,
routes.MapRoute(
name: "ProductRoute",
url: "{productName}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
现在如果我给出这样的东西, localhost:56789 / prd1 / Home / Index
第一个路由正在运行。
但是,如果我直接访问 localhost:56789 / Home / Index 或任何其他控制器操作,例如 localhost:56789 /帐户/登录,则路由无效。< / p>
答案 0 :(得分:1)
用于路线配置
routes.MapRoute(
name: "ProductRoute",
url: "{productName}/{controller}/{action}/{id}",
defaults: new { productName = 'put your method name to get productName over here', controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "your namespace of controller" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
答案 1 :(得分:1)
路由按照定义的顺序与请求匹配。当找到与请求匹配的路由时,不再考虑其他路由。因此,您需要按特定性降低的顺序列出您的路线。
但是,您的第一条路线与第二条路线匹配更多请求,即更少特定于第二条路线:
当ASP.NET MVC尝试将Home/Index
的请求与您的路由匹配时,它会匹配第一条路由,因为它会将Home
视为productName
,它会考虑Index
为controller
名称,其他参数不是必需的。
您需要重新排序路线或使第一条路线更具体。这可以通过在productName
参数上加上约束来完成。
<强>更新强>
在不了解您的产品及其名称的情况下,我无法建议适当的约束。也许您可以使用数字SKU并具有类似
的约束routes.MapRoute(
name: "ProductRoute",
url: "{productName}/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { productName = @"\d+" }
);
强制productName
为数字。
或者,您可以将网址更改为
"products/{productName}/{controller}/{action}/{id}"
有关约束的更多信息,请参阅this link或使用Google。