0

MVC ルートに問題があります。

次の URL にアクセスしようとしています... " http://localhost/api/Countries "

次のルートを次の順序で定義しました...

    RouteTable.Routes.MapHttpRoute(
        name: "Continents",
        routeTemplate: "api/countries/Continents",
        defaults: new { controller = "countries", Action="Continents" }
        );
    RouteTable.Routes.MapHttpRoute(
        name: "CountryRegions",
        routeTemplate: "api/countries/Regions",
        defaults: new { controller = "countries", Action = "CountryRegions" }
        );

    RouteTable.Routes.MapHttpRoute(
        name: "CountryByCodeApi",
        routeTemplate: "api/{controller}/{countryCode}",
        defaults: new { controller="countries", countryCode = System.Web.Http.RouteParameter.Optional }
        );

目的の URL に移動するたびに、 「リクエストに一致する複数のアクションが見つかりました」というエラーが表示されます。routeTemplate プロパティの 3 番目のセグメントがオプションである場合、これは理にかなっていますが、それを中かっこで囲まないことで、ターゲット URL で必須のセグメントになったと理解していました。明らかに「http://localhost/api/countries」には「Continents」または「Regions」が含まれていないため、なぜそれらがリクエストに一致すると識別されるのでしょうか。

知ってるよ。これらのルートは単純なもののように見えますが、実際にやってみると RegEx のように不可解です !!!

何かご意見は?

4

1 に答える 1

1

The last route definition doesn't provide action name through route definition nor it provides it through route defaults. If route definition should omit it, then add it to defaults as this:

routes.MapRoute(
    "CountryByCodeApi",
    "api/{controller}/{countryCode}",
    new {
        controller="countries",
        countryCode = RouteParameter.Optional,
        action = "CountryCodes"
    }
);

Note that this is just the last route definition. The upper couple stays as it is.

public ActionResult CountryCodes(string countryCode)
{
    // do whatever you please
}
于 2012-06-14T17:16:01.760 に答える