4

我们目前在 IIS6 上运行,但希望尽快迁移到 IIS 7。

我们正在将现有的 Web 表单站点迁移到 ASP.Net MVC。我们有很多遗留页面需要重定向到新的控制器。我遇到了这篇看起来很有趣的文章: http ://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

所以我想我可以编写自己的路由处理程序,或者在控制器中进行重定向。后者有轻微气味。

但是,我不太确定如何处理来自遗留 url 的查询字符串值,理想情况下我需要将其传递给控制器​​的 Show() 方法。例如:

旧网址:

/Artists/ViewArtist.aspx?Id=4589

我希望它映射到:

ArtistsController 显示动作

实际上,我的 Show 操作采用艺术家姓名,因此我确实希望将用户从 Legacy 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-您必须将这两个路由添加到 RouteTable 中,您有一个带有 ViewArtist 操作的 ArtistController 接受 int 类型的 id 参数

    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

您将被重定向到:/Artist/ViewArtist/123

于 2009-05-03T23:55:26.510 回答
0

我一直在努力解决这个问题,直到我明白了这一点。在像 Perhentian 这样的控制器中直接在路由配置中执行此操作要容易得多,至少在我的情况下,因为我们的新 URL 中没有id。原因是在控制器中我可以访问我所有的存储库和域对象。为了帮助别人,这就是我所做的:

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 的路径。

例如,这重定向自

/product_list.aspx?catid=50

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

请注意,这RedirectPermanent是 MVC3+。如果您使用的是旧版本,则需要手动创建 301。

于 2012-10-11T20:33:32.533 回答