3

かなりn00bの質問をして申し訳ありませんが、私はASP.NETMVCにかなり慣れていません。私の問題は次のとおりです。

私のサイトでURLを次のように処理したいと思います。

www.mysite.com/homepage/name

上記のリンクをそのユーザーのプロファイルに移動させたい。簡単にするために、コントローラーはテストアクションを持つホームページコントローラーになります。

global.asaxルーティングは次のようになります。

routes.MapRoute(
            "test",
            "homepage/{name}",
            new { controller = "Homepage", action = "Test" }
            );

これまでのところ、コードはうまく機能しています(私はそれをテストしました、そしてそれはうまくルーティングします)。

しかし今、私が欲しい他の機能は有効にすることです:

www.mysite.com/homepage/action/id

同様に動作します。

このためのルーティングは次のようになります。

routes.MapRoute(
            "Default",
            "homepage/{action}/{id}",
            new { controller = "Homepage", action = "Index", id = UrlParameter.Optional }
        );

問題は、ユーザーがアクションの{id}を省略したい場合に何が起こるかということです。ルーティングテーブルは、アクション名が実際には{name}パラメーターであることを検出します。

アクションが存在するかどうかを最初に確認する方法はありますか?そうでない場合にのみ、別のルートのパラメーターとして使用します。

意味がありますか?そうでない場合は、さらに詳細を追加します。

ありがとう!

編集

したがって、制約regexを使用してこれを解決することができました。コントローラー内のすべてのアクションを定義する正規表現を配置しました。

routes.MapRoute(
           "homepage",
           "homepage/{action}/{id}",
           new { controller = "Homepage", action = "Index", id = UrlParameter.Optional },
           new { action = "(action1|action2|action3)" }
           );

そして次のルール:

routes.MapRoute(
            "feed",
            "homepage/{id}",
            new { controller = "Homepage", action = "Test"}
            );

私は大丈夫ですが、これをスケーリングするのは難しいだけです。ここでは、すべての新しいアクションを文字列内のコントローラーに配置することを忘れないでください。これは、デバッグの悪夢の大きな始まりです。

ありがとうございました !

4

2 に答える 2

1

ASP.NET MVCはRouteTable、現在の要求に一致する最初のルートをから選択するため、Global.asaxのルートの順序を変更することで、この問題を修正できるはずです。

最初にこれ:

routes.MapRoute(
            "Default",
            "homepage/{action}/{id}",
            new { controller = "Homepage", action = "Index", id = UrlParameter.Optional }
        );

そしてこれ:

routes.MapRoute(
            "test",
            "homepage/{name}",
            new { controller = "Homepage", action = "Test" }
            );

お役に立てれば。

于 2012-04-05T13:03:53.617 に答える
0

Defaultルートを最初に配置し、許可される値を制限する必要があります

routes.MapRoute(
            "Default",
            "homepage/{action}/{id}",
            new { controller = "Homepage", action = "Index", id = UrlParameter.Optional },
            new {action = @"Index|Delete|Add"}
        );

routes.MapRoute(
            "test",
            "homepage/{name}",
            new { controller = "Homepage", action = "Test" }
            );

このように、最初のルートは、アクション値が制約で指定された値と一致する場合にのみ使用されます。一致しない場合は、次のルールに移動します。

また、ユーザープロファイルを作成するときに、defaultルートでサポートされているアクションの1つと一致する名前がないことを確認する必要があります。

于 2012-04-05T13:14:38.213 に答える