2012-11-16 68 views
0

有沒有辦法在ASP.NET MVC v3中做迴歸路由處理?ASP.NET MVC備用路由

以下是我的業務案例示例:如果給定URL「www.mysite.com/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匹配來匹配路由。我希望路由機制足夠聰明,知道路由是否會成功並找到合適的控制器。

回答

1

我根據同事的建議和下面的鏈接回答我的問題(感謝,喬希!):

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(我們希望在此實例中執行)時忽略此路線。

1

在Globasl.asax.cs中定義下面的Content路由。

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

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

那麼這是否意味着如果www.mysite.com/faq/Index並沒有FaqController,它會轉到ContentController?我認爲它會拋出404錯誤。 – bryanjonker

+0

路由的工作原理是:如果傳入的請求與第一個路由匹配失敗,那麼它將與第二個匹配,直到結束。在這個例子中,你給出了兩個路由不匹配的請求,產生了一個404. – VJAI

+0

我試過在一個測試項目上。默認路由自動抓取/ content/faq路由並拋出404錯誤。它從未到達第二條路線。 – bryanjonker