3

私は最近、これら2つのMVC4ルートの機能が明らかに異なるという事実に火傷を負いました。誰かが何が起こっているのかを強調して、私がよりよく理解できるようになるのではないかと思っていました。

routes.MapRoute(
    "post-User",
    "User",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
    );

routes.MapRoute(
    "post-User",
    "{controller}",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
    );

{controller}ビットはプレースホルダーであり、次の行でcontroller = "User"と言うと、これら2つのステートメントは同等になると思いました。どうやら{controller}を使用すると、すべてのルートにデフォルトが設定されますか?

4

1 に答える 1

5

{controller}サブストリングがコントローラー名のプレースホルダーとして機能するというあなたの信念は正しいです。そのことを念頭に置いて、次のルートはどのコントローラーにも一致しますが、デフォルトUserではコントローラーが指定されていないコントローラーになります。

routes.MapRoute(
    "post-User",
    "{controller}",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

ただし、以下はルートUserと一致し、コントローラーを指定できないため、常にUserコントローラーにルーティングされます。

routes.MapRoute(
    "post-User",
    "User",
    new { controller = "User", action = "create" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

Userこの場合、ルートをコントローラーにマップするように強制するだけなので、違いは意味がありません。Userこれは、とにかく最初のルートで発生することとまったく同じです。

ただし、次の点を考慮してください。

routes.MapRoute(
    "post-User",
    "User/{action}",
    new { controller = "User", action = "MyDefaultAction" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

routes.MapRoute(
    "foo",
    "{controller}/{action}",
    new { controller = "User", action = "Index" },
    new { httpMethod = new HttpMethodConstraint("POST") }
);

これで、最上位ルートがUserコントローラーへの要求と一致し、オプションのアクションが指定され、デフォルトで。になりますMyDefaultAction他のコントローラーへの要求は、最初のルートとは一致しません(ルートは定数文字列で始まらないためUser)。デフォルトでは、2番目のルート(foo)に戻ります。繰り返しますが、アクションはオプションです。ただし、現在、コントローラーへの要求とは異なり、User他のコントローラーのデフォルトのアクションはアクションになりますIndex

だから今...

.../UserデフォルトはMyDefaultActionアクションです。

.../SomeOtherControllerデフォルトはIndexアクションです。

于 2013-01-25T19:47:05.920 に答える