2

2 つのエリアと共通エリアを含む MVC3 サイトがあります。また、アイテムのリストをページ分割するために指定されたルートもあります。私のRegister_Routes方法は次のようになります。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Paginate", // Route name
            "{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new { controller = "Home", action = "Index", itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = UrlParameter.Optional } // Parameter defaults
        );

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

    }

私が気付いた (そして理解していない) ことは、ホームページからログアウトすると、ログイン ページからのリダイレクトが次のようになることです。

http://localhost:62695/Account/LogOn?ReturnUrl=%2fHome%2fPaginate

...ログインすると、次の URL を除いて、自分のホームページが表示されます。

http://localhost:62695/Home/Paginate

この時点で、ルートマップで何かを台無しにしたことはかなり確信していますが、それは正しいように思えます. 私は何を間違っていますか?

提案ごとに更新 して、ルートを次のように変更しました。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Paginate", // Route name
            "{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new { controller = "Home", action = "Index", searchString = UrlParameter.Optional } // Parameter defaults
        );

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

    }

...そして、ホームインデックスページは実際に正しく機能しているように見えますが、現在、ページネーションは機能していません:

        return RedirectToAction("Paginate", new { itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = string.Empty });

Admin\HomeController で次の URL が生成されます。

http://localhost:62695/Admin/Users/Paginate?itemsPerPage=25&pageNumber=1

だから私はまだここで何か間違ったことをしています。

UPDATE 2 OK、これが私が望んでいた方法で動作させる方法です: 私のRegisterRoutes方法は次のようになります:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            null,
            "{area}/{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new {area = string.Empty, controller = "Home", action="Paginate", searchString = UrlParameter.Optional } // Parameter defaults
        );

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

...しかし、これではルーティングの問題を解決するには不十分でした。これに加えて、ルートをエリア登録に追加する必要がありました。私の AdminAreaRegistration は次のようになります。

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            null,
            "Admin/{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}", // URL with parameters
            new { controller = "Home", action = "Paginate", searchString = UrlParameter.Optional } // Parameter defaults
        );

        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }

これにより、接続の変更に加えて、RedirectToRouteすべての URL がきれいになり、同時に機能するようになりました。すべての回答が私の目標を達成するのに役立ちました。私は全員を +1 し、道に最も近い回答を選択しました。

4

3 に答える 3

2

ルートは登録順に評価されます。特にすべてのセグメントのデフォルト値を宣言したため、登録した最初のルートによってリダイレクトが生成されています。より具体的なルートを定義することを検討することをお勧めします

更新 RedirectToAction の代わりに RedirectToRoute を使用して、目的の URL 生成を取得します

RedirectToRoute("Paginate", new { itemsPerPage = SiteSettings.ItemsPerPage, pageNumber = 1, searchString = string.Empty });
于 2012-04-10T02:25:36.303 に答える
1
routes.MapRoute(null, // do not name your routes, it's a "magic string"
    "{controller}/Paginate/{itemsPerPage}/{pageNumber}/{searchString}",
        new 
        { 
            controller = "Home", 
            action = "Index", 
            searchString = UrlParameter.Optional
        } 
    );

// instead of RedirectToAction, try RedirectToRoute, and do not use the route name
return RedirectToRoute(new 
    { 
        controller = "Home",
        area = "AreaName",
        itemsPerPage = SiteSettings.ItemsPerPage, 
        pageNumber = 1, 
        searchString = string.Empty, 
    }
);
于 2012-04-10T04:28:12.367 に答える
1

URL に戻る理由は、http://localhost:62695/Home/Paginateログインすると、指定された URL、つまり の?ReturnUrl=%2fHome%2fPaginate部分に戻るためですhttp://localhost:62695/Account/LogOn?ReturnUrl=%2fHome%2fPaginate。あなたのホームページのURLではないですか?あなたは決して指定しませんでした。

最初の定義も優先される可能性がありますが、どこでそれを聞いたのかわからないので、デフォルトの定義を最初に配置すると、それが取得される可能性があります。

于 2012-04-10T02:23:18.027 に答える