0

我有在 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)或不显示(例如/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上运行?

4

1 回答 1

1

问题出现在System.Web.Routing.Route.ProcessConstraint()方法中。

Mono 仅在值(作为字符串)不为空或不为空时评估正则表达式。如果您在没有任何参数的情况下访问路由,则该值是一个UrlParameter实例(即UrlParameter.Optional),并且 this as string 为空。因此,表达式永远不会被评估。

要解决这个问题,您可以实现自己的 Route 对象并以不同的方式处理那里的事情。更多关于这在我的博客文章中。

这是导致该行为的单声道实现ProcessConstraintInternal()方法。MatchConstraintRegex()仅当参数值不为 null 或为空时才调用。

于 2012-12-14T14:26:12.510 回答