2

Booking Controllerは次のコードを持っています

public ActionResult Index(string id, string name)
{
    return View();
}

そして私routeConfigは以下のルートマッピングを持っています

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "Search",
            url: "{controller}/{location}/{checkIn}/{checkOut}/{no}",
            defaults: new { controller = "Search", action = "Index", location = UrlParameter.Optional, checkIn = UrlParameter.Optional, checkOut = UrlParameter.Optional, no = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "booking",
            url: "{controller}/{action}/{id}/{name}",
            defaults: new { controller = "Booking", action = "Index", id = UrlParameter.Optional, name=UrlParameter.Optional }
        );}

しかし、ページにアクセスすると、http://localhost:59041/booking/index/1/libin両方のパラメータがを返しますnull

4

1 に答える 1

2

この本を見る

アプリケーションがより複雑になるにつれて、複数のルートを登録する可能性があります。これを行うときは、登録する順序を考慮することが重要です。ルーティング エンジンは、一致するルートを見つけようとすると、単にルートのコレクションを列挙し、一致が見つかるとすぐに列挙を停止します。

コメントを追加する 予期しない場合、これにより多くの問題が発生する可能性があります。これが問題になる例を見てみましょう。

routes.MapRoute(
    >     "generic", // Route name
    >     "{site}", // URL with parameters
    >     new { controller = "SiteBuilder", action = "Index" } // Parameter defaults );
    > 
    > routes.MapRoute(
    >     "admin", // Route name
    >     "Admin", // URL with parameters
    >     new { controller = "Admin", action = "Index" } // Parameter defaults );

上記のスニペットは 2 つのルートを登録します。最初のルート

単一のプレースホルダ セグメントを含み、コントローラ パラメータのデフォルト値を SiteBuilder に設定します。2 番目のルートには 1 つの定数セグメントが含まれ、コントローラー パラメーターのデフォルト値が Admin に設定されます。

これらのルートは両方とも完全に有効ですが、最初のルートは入力されたほぼすべての値と一致するため、マップされる順序によって予期しない問題が発生する可能性があります。つまり、最初に一致することになります。

http://example.com/Adminであり、最初の一致が見つかった後にルーティング エンジンが停止するため、2 番目のルートが使用されることはありません。

したがって、このシナリオを念頭に置いて、カスタム ルートを定義する順序を検討してください。

最初に予約ルートを書くべきです

  routes.MapRoute(
            name: "booking",
            url: "{controller}/{action}/{id}/{name}",
            defaults: new { controller = "Booking", action = "Index", id = UrlParameter.Optional, name=UrlParameter.Optional }
        );}
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "Search",
            url: "{controller}/{location}/{checkIn}/{checkOut}/{no}",
            defaults: new { controller = "Search", action = "Index", location = UrlParameter.Optional, checkIn = UrlParameter.Optional, checkOut = UrlParameter.Optional, no = UrlParameter.Optional }
        );
于 2013-02-28T05:04:50.133 に答える