2010-02-11 55 views
1

我無法獲得路由工作以限制控制器的動作參數只能是整數。ASP.NET MVC路由不能與約束條件工作

我有AA控制器動作如下:

[RequiresRole(RoleToCheckFor = "Administrator"), AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit(int id) 
    { 
     ... 
    } 

和Global.asax.cs中以下路線:

 routes.MapRoute(
      "UserEdit",  
      "user/edit/{id}",  
      new {controller = "user", action = "edit"}, 
      new {id = @"\d+"} 
      ); 

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

     routes.MapRoute("Error", 
       "{*url}", 
       new { controller = "Error", action = "notfound" }); 

因此我很期待,如果我進入http://domain.com/user/edit/ABCD不該「T得到以下通常錯誤:

參數字典包含空對於參數非空類型「System.Int32」的方法'身份證「System.Web.Mvc.ActionResult編輯(Int32)已」

這(我認爲)項正是當時還表示http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-24-cs.aspx

但是,我仍然看到「... null entry ...」錯誤。

任何想法,爲什麼這是這樣嗎?我的路線設置有問題嗎?

感謝

回答

3

你的第二個路線

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

正趕上它,是不受約束的。

使用Phil Haacks route debugger for such issues

1

正如保羅指出,路由正確被跳過,因爲約束不匹配。因此,路由系統繼續到下一個路由並嘗試匹配它。因爲第二條路線不受限制,它將匹配並被處理。

有很多方法可以解決這個問題。

最簡單的方法之一是從路線中刪除約束並在控制器操作中執行參數驗證簽入。

另一種方式是,供應給顯示錯誤編輯路線後,立即添加一個額外的路線:

routes.MapRoute(
     "UserEditError", 
     "user/edit/{id}", 
     new {controller = "user", action = "EditError"} 
     ); 

注意,這條航線上有沒有約束,去到EditError行動。這樣,您可能會爲輸入無效網址的用戶提供更好的錯誤。

0

一個錯誤,我總是設法 化妝是把

controller = "HomeController"而不是controller = "Home"。每次都會破壞你的路線:-)

context.MapRoute(
    name: "RedirectAll", 
    url: "{*url}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { typeof(HomeController).Namespace }, 
        constraints: new { host = new HostConstraint("defenderrazor.com") });