2013-09-26 547 views
1

我看到很多MVC路由的問題,並且遇到了類似的問題,導致路由匹配URL。MVC 4:自定義路由

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

routes.MapRoute("Beer", "Beer/{beerid}", new { controller = "Beer", action = "Id", beerid = 0}); 

routes.MapRoute("Beer", "Beer/{beername}", new { controller = "Beer", action = "Name" }); 

BeerController方法

public ActionResult Id(int beerid) 
public ActionResult Name(string beername) 

如果我改變方法如下,

public ActionResult Id(int? id)  
public ActionResult Name(string id) 

默認路由的工作原理與以下網址:

http://localhost/Beer/Id/100 
http://localhost/Beer/Name/Coors 

但什麼我要去的只是

http://localhost/Beer/100 
http://localhost/Beer/Coors 

任何想法?

回答

3

所以這裏有一些東西。

  1. 更具體的路線應放置之前更一般途徑,因爲那是相匹配的第一路線將被用於和路由在它們被添加的順序進行檢查。

  2. 如果您打算不在URL中提供動作的名稱,那麼您需要做一些事情來確保正確的路由被定位,以便使用正確的默認值。在你的情況下,你可以使用路由約束來區分這兩者。試着改變你的啤酒ID路由到此:

    routes.MapRoute(
        name: "Beer", 
        url: "Beer/{beerid}", 
        defaults: new { controller = "Beer", action = "Id", beerid = 0}, 
        constraints: new { beerid = @"\d+" } 
    ); 
    

    約束將確保路由只匹配其中第二部分是由一個或多個數字兩部分的URL。此路線以及您的啤酒名稱路線應置於默認路線之前。

UPDATE

我的配置似乎是得到你想要的結果。我RegisterRoutes方法的整體情況如下:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

routes.MapRoute(
    name: "Id", 
    url: "Beer/{beerid}", 
    defaults: new { controller = "Beer", action = "Id", beerid = 0 }, 
    constraints: new { beerid = @"\d+" } 
); 

routes.MapRoute(
    name: "Name", 
    url: "Beer/{beername}", 
    defaults: new { controller = "Beer", action = "Name" } 
); 

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

我只是去嘗試 - 它仍然沒有路由..得到一個資源不能被發現:請求的URL:/啤酒/ 110 Id的操作方法是沒有被擊中.. 我試圖創建一個名爲BeerById的新操作方法,並使用它來避免與Id方法混淆..它只是沒有選擇路由規則.. Global.asax.cs斷點不會打到 – Jay

+0

@Jay你應該要求* /啤酒/ 110 *不是**啤酒**。您的路線設置完全匹配「啤酒」。 – asymptoticFault

+0

對不起..這是http:// localhost:22449 /啤酒/ 100「啤酒」是一個錯字 – Jay