0

私はMVCアプリケーションをローカルで開発しており(IIS Express)、テストのために定期的にIIS7.5に展開しています。

Global.asax.csファイルに新しい名前のRouteを追加しました。

        routes.MapRoute(
            "MyCustomRoute", // Route name
            "{documentID}/{year}", // URL with parameters
            new { controller = "Documents", action = "CurrentVersion", year = DateTime.Now.Year }, // Parameter defaults
            new { documentID = @".*\d+.*" } // Regex matches only where documentID contains numerical values.
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Documents", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

「MyCustomRoute」を使用してHtml.RouteLinkを設定しましたが、すべてローカルマシンで正常に機能します。ただし、これをWebサーバーで実行すると、Html.RouteLinkが空のリンクを生成します。さらに、URLをブラウザに直接入力すると、404が表示されます。

ルートが登録されていないようです。私は何が欠けていますか?

4

1 に答える 1

0

コードを見ずにルートをデバッグすることは不可能です。適切なツールを使用すれば、何が起こっているのか、何が一致しているのかを簡単に確認できます。

Phil Haack はRouteDebuggerと呼ばれる優れたオープン ソース ツールを作成しました。NuGet から取得し、 http://haacked.com/archive/2011/04/12/routedebugger-2.aspxで使用方法を確認できます。このプロジェクトのより堅牢なバージョンは、RouteMagic として入手でき、Codeplexおよびgitあります。詳細はこちらのブログ投稿

アップデート

正規表現に基づいて、貪欲のために documentID が一致していません。 .*はすべてに一致するため、 に一致する機会がありません。これは\d+、前のパターンがすべての一致を共食いするためです。http://www.regular-expressions.info/repeat.htmlで正規表現の貪欲さと怠惰について読むことができます。

更新 2

正規表現はおそらく私がプログラミングで最も苦手なものであり、私がその問題を認識した唯一の理由は、私が正規表現が苦手で、約 100 万回同じ問題に遭遇したからです。そうは言っても、うまくいくと思います @"(.*?)(\d+?)(.*?)"。括弧がなくても機能するはずですが ( など@".*?\d+?.*?")、読みやすくするために括弧を入れておきます (ほとんどの場合、括弧が苦手なためです)。

于 2012-09-11T12:43:37.937 に答える