我有一个在 Linux 上以单声道方式运行的 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)或不显示(例如/search)时,它在 Windows 中工作正常。现在,在我将它部署到 Linux 上后,问题出现了:它返回 404 用于没有术语的路由(例如/search),并且可以正常使用术语(例如/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 上工作吗?
最佳答案
问题出现在 System.Web.Routing.Route.ProcessConstraint()
方法中。
如果值(作为字符串)不为 null 或为空,Mono 只会评估正则表达式。如果您在没有任何参数的情况下访问路由,则该值是一个 UrlParameter
实例(即 UrlParameter.Optional
),并且 this as string 为 null。因此表达式永远不会被计算。
要解决此问题,您可以实现自己的 Route 对象并以不同方式处理那里的事情。 More on that in my blog post .
和here是导致行为的单声道实现。查看 ProcessConstraintInternal()
方法。 MatchConstraintRegex()
仅在参数值不为 null 或为空时调用。
关于linux - 具有可选参数的 .NET mono MVC3 路由约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13849508/