我意识到以特定顺序定义和执行路由的概念,但我定义了以下路由:
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不会进入默认路由。
感谢任何帮助。
答案 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等定义特定路线,并将它们放在默认路线之前。