2012-12-12 21 views
0

約束我有一個下單在Linux上運行的應用程序MVC3。 我有這樣的路線:.NET單MVC3路線可選parametr

routes.MapRoute(
     "search", 
     @"search/{term}", 
     new { 
      controller = MVC.Mobile.Name, 
      action = MVC.Mobile.Actions.ActionNames.Search, 
      term = UrlParameter.Optional 
     }, 
     new { 
      term = @"^[0-9]*$" 
     } 
    ); 

其工作正常在窗口兩者當我顯示術語參數(例如/搜索/ 123)或內部消除(例如/搜索)。現在,在我將它部署到Linux上後,問題就出現了:它爲無路徑(例如/ search)的路由返回404,並且與term(例如/ search/123)一起正常工作。

我結束了分裂這條路線分爲兩個:

 routes.MapRoute(
      "search-empty", 
      @"search", 
      new { 
       controller = MVC.Mobile.Name, 
       action = MVC.Mobile.Actions.ActionNames.Search 
      } 
     ); 

     routes.MapRoute(
      "search", 
      @"search/{term}", 
      new { 
       controller = MVC.Mobile.Name, 
       action = MVC.Mobile.Actions.ActionNames.Search 
      }, 
      new { 
       term = @"^[0-9]*$" 
      } 
     ); 

我也試圖與REG EXP發揮和定義的默認值,而不是可選的參數項沒有任何成功。 是否有人知道它爲什麼在Windows上工作,而不是在Linux上?

回答

1

問題出現在System.Web.Routing.Route.ProcessConstraint()方法。

單聲道僅評估規則運算的值(如串)不是空值或空白。如果您正在訪問的路線不帶任何參數的值是一個UrlParameter實例(即UrlParameter.Optional)並將此作爲字符串爲空。因此表達式從不被評估。

爲了解決這個問題,你可以實現自己的Route對象和不同的方式處理事情出現了。 More on that in my blog post

而且here是單執行導致的行爲。看看ProcessConstraintInternal()的方法。僅當參數值不爲空或空時才調用MatchConstraintRegex()