【问题标题】:ASP.NET MVC alternate routingASP.NET MVC 备用路由
【发布时间】:2012-11-05 09:20:03
【问题描述】:

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

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

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

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

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

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

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

编辑。澄清一下,我不是想通过简单的 URL 匹配来查看它是否与路由匹配。我希望路由机制足够智能,可以知道路由是否成功并找到合适的控制器。

【问题讨论】:

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


    【解决方案1】:

    在 Globasl.asax.cs 中的 Default 下方定义 Content 路由。

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

    【讨论】:

    • 那么这是否意味着如果 www.mysite.com/faq/Index 并且没有 FaqController,它将转到 ContentController?我以为它会抛出 404 错误。
    • 路由的工作原理是,传入的请求与第一个路由匹配,如果失败,那么它将与第二个匹配直到结束。在示例中,您给出的两个路由都不匹配导致 404 的请求。
    • 我在一个测试项目中尝试过。 Default 路由自动抓取 /content/faq 路由并抛出 404 错误。它从未到达第二条路线。
    【解决方案2】:

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

    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,并且仅当 Match 方法与我们现有的路由控制器之一不匹配时才返回 true。如果 Match 方法在 ContentRouteConstraint() 上失败,那么它会下降到下一个路由。

    这样做的好处是我可以在尝试生成 URL 时忽略此路由(我们希望在本例中这样做)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多