クエリ文字列IDをコントローラーアクションに渡すASP.Net MVCルーティングレガシーURL

StackOverflow https://stackoverflow.com/questions/817325

質問

現在IIS6で実行していますが、すぐにIIS 7に移行することを望んでいます。

既存のWebフォームサイトをASP.Net MVCに移行しています。新しいコントローラーにリダイレクトする必要があるレガシーページがかなりあります。私は面白そうに見えるこの記事に出会いました: http://blog.eworldui。 net / post / 2008/04 / ASPNET-MVC --- Legacy-Url-Routing.aspx

したがって、独自のルートハンドラを作成するか、コントローラでリダイレクトを行うことができます。後者はわずかに臭いがします。

ただし、理想的にはコントローラーのShow()メソッドに渡す必要があるレガシーURLからのクエリ文字列値の処理方法がよくわかりません。例:

以前のURL:

  

/Artists/ViewArtist.aspx?Id=4589

これをマッピングしたい:

  

ArtistsControllerアクションを表示

実際には、Showアクションにはアーティスト名が必要なので、ユーザーをレガシーURLから/ artists / Madonnaにリダイレクトする必要があります

ありがとう!

役に立ちましたか?

解決

あなたが言及した記事に応じて、これらはこれを達成するためのステップです:

1-LegacyHandlerはクエリ文字列からルート値を抽出する必要があります(この場合はアーティストのIDです) これを行うコードは次のとおりです。

 public class LegacyHandler:MvcHandler
    {
        private RequestContext requestContext;
        public LegacyHandler(RequestContext requestContext) : base(requestContext)
        {
            this.requestContext = requestContext;
        }

        protected override void ProcessRequest(HttpContextBase httpContext)
        {
            string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName;

            var queryString = requestContext.HttpContext.Request.QueryString;
            foreach (var key in queryString.AllKeys)
            {
                requestContext.RouteData.Values.Add(key, queryString[key]);
            }

            VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName,
                                                                    requestContext.RouteData.Values);
            httpContext.Response.Status = "301 Moved Permanently";
            httpContext.Response.AppendHeader("Location", path.VirtualPath);

        }
    }

2- int型のidパラメーターを受け入れるViewArtistアクションを持つArtistControllerがあるRouteTableにこれらの2つのルートを追加する必要があります

    routes.Add("Legacy", new LegacyRoute("Artists/ViewArtist.aspx", "Artist", new LegacyRouteHandler()));

    routes.MapRoute("Artist", "Artist/ViewArtist/{id}", new
        {
         controller = "Artist",
         action = "ViewArtist",
        });

次のようなURLに移動できます:/Artists/ViewArtist.aspx?id=123

そしてリダイレクトされます:/ Artist / ViewArtist / 123

他のヒント

頭を悩ませるまで、これに少し苦労していました。新しいURLには id が含まれていないため、少なくとも私の状況では、Perhentianが直接ルート設定で行ったように、コントローラーでこれを行う方がはるかに簡単でした。その理由は、コントローラーで、すべてのリポジトリーとドメインオブジェクトにアクセスできるからです。他の人を助けるためにこれが私がしたことです:

routes.MapRoute(null,
    "product_list.aspx", // Matches legacy product_list.aspx
     new { controller = "Products", action = "Legacy" }
);

public ActionResult Legacy(int catid)
{
    MenuItem menuItem = menu.GetMenuItem(catid);
    return RedirectPermanent(menuItem.Path);
}

menu は、メニューエントリのURLであるPathなど、メニューエントリに関連する情報を保存したオブジェクトです。

これは、たとえばからリダイレクトします

/product_list.aspx?catid=50

to

/ pc-tillbehor / kylning-flaktar / flaktar / 170-mm

RedirectPermanent はMVC3 +であることに注意してください。古いバージョンを使用している場合は、301を手動で作成する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top