2012-12-12 18 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()