2010-02-23 60 views
1

問計於最好的方式來解決這個問題:URL路由參數名稱,訂單

在我的控制器

我有以下作用

public ActionResult Member(string id){return View();} 

在同一個控制器的另一個行動

public ActionResult Archive(string year){return View();} 

在我的global.asax

routes.MapRoute(
      "Archive",            // Route name 
      "{controller}/{action}/{year}",       // URL with parameters 
      new { controller = "Home", action = "Index", year = "" } // Parameter defaults 
     ); 

routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id="" } // Parameter defaults 
     ); 

如果我將這個網址稱爲mysite.com/archive/2009,這是可行的,因爲預期帶有名稱「year」的參數的動作和第一個路由模式適用於此請求。但是如果我打電話給這個網址mysite.com/member/john它將導致這個網址mysite.com/member?id=john 因此,看起來如果我在global.asax中的第一條路線具有相同的構造但參數名稱不同,具有正確參數名稱的人將擁有正確的url(mysite.com/archive/2009),但其他人不會。我該如何解決這個問題?我可以更改路由表以期望像「param」這樣的通用參數名稱,但我需要將該動作的所有簽名更改爲「param」,並且它不是非常具有描述性(參數代替年份或參數代替id)。

回答

0

試試這個:

routes.MapRoute(
      "Archive",            // Route name 
      "Home/Member/{id}",       // URL with parameters 
      new { controller = "Home", action = "Member", id = "" } // 
Parameter defaults 
     ); 

routes.MapRoute(
      "Archive",            // Route name 
      "{controller}/{action}/{year}",       // URL with parameters 
      new { controller = "Home", action = "Index", year = "" } // Parameter defaults 
     ); 

你被允許在第二個參數使用文字,他們將充當過濾器。您的路線越具體,您需要越靠近路線配置的頂部,路線系統就會選擇匹配的第一條路線。

以下是link的更多詳細背景信息。自文章撰寫以來,一些語法已經發生了變化,但基本規則似乎是最新的。

+0

又一次令人困惑,我會使用會員不是年份的ID。 – dritterweg 2010-02-23 20:23:04

+0

對不起,做了一個編輯。重點是您需要在路由中指定該操作,以便路由類可以識別要使用的路由。此外,它使用匹配的第一條路線,因此您需要首先放置更具體的路線。 – 2010-02-23 20:29:58