默认路由不起作用

时间:2014-09-01 09:12:31

标签: c# asp.net-mvc

在我的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>

  1. 是因为我定义了{productName}吗?
  2. 为了测试目的,我如何添加一些产品,如prd1,prd2和路由?

2 个答案:

答案 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,它会考虑Indexcontroller名称,其他参数不是必需的。

您需要重新排序路线或使第一条路线更具体。这可以通过在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。