我有在linux上使用mono运行的MVC3应用程序。 我有这条路线:
routes.MapRoute(
"search",
@"search/{term}",
new {
controller = MVC.Mobile.Name,
action = MVC.Mobile.Actions.ActionNames.Search,
term = UrlParameter.Optional
},
new {
term = @"^[0-9]*$"
}
);
当我显示术语参数(例如/ search / 123)或whithout(例如/ search)时,在Windows中正常工作。现在问题出现在我在linux上部署之后:它返回404没有术语(例如/搜索)的路由,并且与术语(例如/ 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上吗?
答案 0 :(得分:1)
问题出现在System.Web.Routing.Route.ProcessConstraint()
方法中。
如果值(作为字符串)不为null或为空,Mono仅评估正则表达式。如果您正在访问没有任何参数的路由,则该值为UrlParameter
实例(即UrlParameter.Optional
),并且此字符串为null。因此,永远不会评估表达式。
要解决此问题,您可以实现自己的Route对象并以不同方式处理它们。 More on that in my blog post
here是导致行为的单声道实现。查看ProcessConstraintInternal()
方法。仅当参数值不为null或为空时才会调用MatchConstraintRegex()
。