基于段数的asp.Net MVC 3路由

时间:2011-11-02 05:16:37

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

我意识到以特定顺序定义和执行路由的概念,但我定义了以下路由:

routes.MapRoute(
            "Image",                                        
            "Image/{action}/{width}/{height}/{file}",       
            new { controller = "Image", action = "Thumbnail", width = 250, height = 250 }
        );

routes.MapRoute(
           "GetCampaignsByCampaignType",
           "Endorsement/GetCampaignsByCampaignType/{campaignType}",
           new { controller = "Endorsement", action = "GetCampaignsByCampaignType" }
        );

routes.MapRoute(
            "Help",
            "Help",
            new { controller = "Help", action = "Contact" } 
        );

routes.MapRoute(
            "Campaigns",
            "Campaigns",
            new { controller = "Endorsement", action = "Campaigns" } 
        );

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );

routes.MapRoute(
            "Campaign",
            "{campaignUrlName}",
            new { controller = "Endorsement", action = "GetCampaign" }
        );

问题与底部2条路线有关。我有像夏天,/冬天,/其他名字这样的广告系列,我有数百个这样的广告,并且不想对它们进行硬编码。我还有其他路线,我希望像/广告系列/帐户, / Help / Me / Please(有多个段/ 1/2或/ 1/2/3)

允许我将/ 1转到上面定义的最后一条路线和/ 1/2或/ 1/2/3的正确顺序或定义是默认的{controller} / {action} / {id}

目前,两种方案都转到默认路由{controller} / {action} / {id},包括/ 1。如果我将它们反转,那么/ 1可以工作,但/ 1/2或/ 1/2/3不会进入默认路由。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

通过正则表达式找到解决方案:

 routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", id = UrlParameter.Optional },
            new { action = @"\w*" }
        );

        routes.MapRoute(
            "Campaign",
            "{campaignUrlName}",
            new { controller = "Endorsement", action = "GetCampaign" },
            new { campaignUrlName = @"^([a-zA-Z])[a-zA-Z_-]*[\w_-]*[\S]$|^([a-zA-Z])[0-9_-]*[\S]$|^[a-zA-Z]*[\S]$" }
        );

这种方式需要操作,默认为两个段/ 1/2(完美),并且永远不会捕获任何单个段URL,并且最后一个路径在通过所有其他路径后被点击,并且只是确保它包含正确的字符。

答案 1 :(得分:0)

您的默认路线将始终覆盖您的广告系列路线,因为控制器和方法有默认值。所以/ Winter将被解释为“WinterController”(它不存在)与默认索引(也不存在),因此您将获得404.

您必须为/ Winter和/ Summer等定义特定路线,并将它们放在默认路线之前。