0

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 にデプロイした後に発生します。用語のないルート (/search など) に対して 404 を返し、用語 (/search/123 など) で正常に動作します。

このルートを 2 つに分割することになりました。

        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]*$"
            }
        );

また、正規表現で遊んで、オプションのパラメーターの代わりにデフォルト値で用語を定義しようとしましたが、成功しませんでした。なぜそれがWindowsで動作し、Linuxでは動作しないのか知っている人はいますか?

4

1 に答える 1

1

問題はSystem.Web.Routing.Route.ProcessConstraint()方法で発生します。

Mono は、値 (文字列として) が null または空でない場合にのみ正規表現を評価します。パラメータなしでルートにアクセスしている場合、値はUrlParameterインスタンス (つまりUrlParameter.Optional) であり、文字列としての this は null です。したがって、式は評価されません。

この問題を解決するには、独自の Route オブジェクトを実装して、そこで別の方法で処理することができます。詳細については、私のブログ投稿を参照してください

そして、これが動作を引き起こすモノ実装です。ProcessConstraintInternal()メソッドを見てください。MatchConstraintRegex()パラメータ値が null または空でない場合にのみ呼び出されます。

于 2012-12-14T14:26:12.510 に答える