4

現在 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 にリダイレクトする必要があります。

ありがとう!

4

2 に答える 2

6

あなたが言及した記事に応じて、これを達成するための手順は次のとおりです。

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",
        });

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

/Artist/ViewArtist/123 にリダイレクトされます。

于 2009-05-03T23:55:26.510 に答える
0

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

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

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

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

于 2012-10-11T20:33:32.533 に答える