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

我们正在将现有的Web表单站点移动到ASP.Net MVC。我们有很多传统页面需要重定向到新控制器。我看到这篇看起来很有趣的文章: http://blog.eworldui。净/后/ 2008/04 / ASPNET-MVC ---旧的URL-Routing.aspx

所以我想我可以编写自己的路由处理程序,也可以在控制器中进行重定向。后者略微闻起来。

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

旧版网址

  

/Artists/ViewArtist.aspx?Id=4589

我想将其映射到:

  

ArtistsController Show action

实际上我的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-你必须将这两条路线添加到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

其他提示

我一直在苦苦挣扎,直到我抓住它。在像Perhentian这样的控制器中直接在路由配置中执行此操作要容易得多,至少在我的情况下,因为我们的新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 是一个对象,我存储了与菜单条目相关的信息,例如Path,它是菜单项的URL。

此重定向来自例如

<代码> /product_list.aspx?catid=50

<代码> / PC-tillbehor / kylning-flaktar / flaktar / 170毫米

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top