ASP.NET MVC备用路由

时间:2012-11-16 16:03:39

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

有没有办法在ASP.NET MVC v3中进行回归路由处理?

这是我的商业案例:如果给出一个URL“www.mysite.com/faq/Index”,我希望检查控制器“FAQ”是否存在路由,操作“索引”< / p>

routes.MapRoute("Default","{controller}/{action}/{id}",
            new { id = UrlParameter.Optional });

如果无法解决,通常会抛出404错误。相反,我希望它使用这条路线:

routes.MapRoute("Content", "Content/{*contentPath}", 
            new { controller = "Content", action = "RenderPageByURL" });

如果失败,那么它应该返回404。

我在想我可以创建一个自定义错误处理程序,但这似乎很糟糕。关于从哪里开始的任何想法?或者这是一个真正的坏主意(TM),我应该回到业务并告诉他们使用正确的路径开始?谢谢。

修改的。为了澄清,我不是要通过简单的URL匹配来查看它是否与路由匹配。我希望路由机制足够智能,以了解路由是否成功并找到合适的控制器。

2 个答案:

答案 0 :(得分:1)

在Global.asax.cs中的Content下面定义Default路由。

routes.MapRoute("Default","{controller}/{action}/{id}",
            new { id = UrlParameter.Optional });

routes.MapRoute("Content", "Content/{*contentPath}", 
            new { controller = "Content", action = "RenderPageByURL" });

答案 1 :(得分:1)

我根据同事的建议和以下链接回答我的问题(谢谢,Josh!):

http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx

基本上,我在路线上添加了自定义约束。

 routes.MapRoute("Content", "{*contentPath}", 
        new { controller = "Content", action = "RenderPageByURL" }, 
        new { matchController = new ContentRouteConstraint() });

 routes.MapRoute("Default","{controller}/{action}/{id}",
        new { id = UrlParameter.Optional });

ContentRouteConstraint()实现IRouteConstraint,并且仅当匹配方法与我们现有的路径控制器不匹配时才返回true。如果Match方法在ContentRouteConstraint()上失败,则它将下拉到下一个路径。

关于这一点的好处是我可以在尝试生成URL时忽略此路由(我们希望在此实例中执行此操作)。