linux - 具有可选参数的 .NET mono MVC3 路由约束

标签 linux asp.net-mvc-3 routes mono

我有一个在 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/

相关文章:

c - 用户空间到内核空间和 sysfs 以及如何使用 sysfs 更改 igmpv3 pkt 中的一个保留值

linux - 在 Armbian(在 Orange Pi Zero 上)上安装 .Net 5 运行时时出现错误

linux - "find -readable"找到不可读的文件夹

c# - 具有特殊字符和子操作的 MVC 路由参数

javascript - 快速路由参数

linux - bash 脚本中带有空格的名称数组

javascript - MVC - 有没有一种很好的方法可以将控件与其各自的 javascript 捆绑在一起?

c# - 如何为 KeyValuePair<string,string> 类型的属性创建自定义 MVC3 模板或 HTML 帮助程序

asp.net-mvc-3 - 如何在 View 中使用ViewBag

node.js - ExpressJS App.use 路由序列