带有可选参数的.NET mono MVC3路由约束

时间:2012-12-12 22:06:31

标签: linux asp.net-mvc-3 routing mono

我有在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上吗?

1 个答案:

答案 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()