2013-07-24 75 views
3

我希望能夠擁有不綁定到控制器的自定義頁面。這些自定義頁面將全部路由到默認控制器。然後還有其他頁面不是自定義的,它們正常地設置了控制器類。我無法使路由規則適用於這兩種情況。MVC路由 - 如果控制器不存在,如何跳過路由規則?

我看起來像這樣的路由規則:

routes.MapRoute(_ 
     name:="Default", _ 
     url:="{controller}/{action}", _ 
     defaults:=New With {.controller = "Home", .action = "Index"} _ 
    ) 

    routes.MapRoute(_ 
     name:="Custom Page", _ 
     url:="{name}", _ 
     defaults:=New With {.controller = "Page", .action = "Index"} _ 
    ) 

這種情況適用於靜態控制器,而不是自定義頁面。它總是試圖找到不存在的自定義名稱(url:=「{name}」)的控制器,所以我得到「資源未找到」錯誤。

如果我顛倒規則,那麼自定義頁面可以正常工作,但靜態頁面不會。

我知道問題在於兩個規則相互重疊,因此總是使用無論哪一個都是第一個。理想情況下,我希望能夠告訴路由尋找一個名爲X的控制器,如果它存在的話就使用它。如果它不存在,則重定向到Y控制器並傳入X作爲參數。現在,如果控制器不存在,它不會繼續到下一個路由規則,它只是表示無法找到資源。

是這樣的可能嗎?

回答

0

我還沒有測試過這個,但我認爲你可能不得不使用{* name},基本上可以捕獲所有的路線,就像在這個答案中看到的那樣=>.Net MVC Routing Catchall not working

您還需要各地切換你的路由,使漁獲都是最特殊的,就像這樣:

routes.MapRoute(_ 
    name:="Custom Page", _ 
    url:="{*name}", _ 
    defaults:=New With {.controller = "Page", .action = "Index"} _ 
) 

routes.MapRoute(_ 
    name:="Default", _ 
    url:="{controller}/{action}", _ 
    defaults:=New With {.controller = "Home", .action = "Index"} _ 
) 

您可能還需要使用{*包羅萬象},而不是{*名字},但我對此不確定。

0

這裏我提供了一個問題的解決方案。對於每條路線,您可以定義一條替代路線,如果路線沒有控制器,則使用替代路線。

var defaultRoute = routes.MapReplaceableRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = 
    UrlParameter.Optional } 
     ); 

     var route = routes.MapRoute(
      name: "Dynamic", 
      url: "{name}", 
      defaults: new { controller = "Dynamic", action = "Index" }); 

     defaultRoute.AlternativeRoute = route; 

線索是最新的一行! here是帖子的鏈接

+0

謝謝!這解決了我的問題。博客文章中的代碼稍微不完整,所以任何想使用它的人都應該閱讀帖子(瞭解它),並在帖子末尾抓取作者鏈接的圖書館。 – sorenhk