クエリ文字列IDをコントローラーアクションに渡すASP.Net MVCルーティングレガシーURL
-
03-07-2019 - |
質問
現在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を手動で作成する必要があります。