ASP.Net MVC маршрутизирует устаревшие URL-адреса, передавая идентификаторы строки запроса действиям контроллера - PullRequest
4 голосов
/ 03 мая 2009

В настоящее время мы работаем на IIS6, но надеемся вскоре перейти на IIS 7.

Мы перемещаем существующий сайт веб-форм в ASP.Net MVC. У нас довольно много устаревших страниц, которые нам нужно перенаправить на новые контроллеры. Я наткнулся на эту статью, которая выглядела интересно: http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

Так что, я думаю, я мог бы написать свой собственный обработчик маршрута или выполнить перенаправление в контроллере. Последний слегка пахнет.

Однако я не совсем уверен, как обрабатывать значения строки запроса из устаревших URL-адресов, которые в идеале мне нужно передать методу Show () моего контроллера. Например:

Legacy URL:

/ Художники / ViewArtist.aspx? Id = 4589

Я хочу, чтобы это сопоставилось с:

ArtistsController Показать действие

На самом деле мое действие Show принимает имя исполнителя, поэтому я хочу, чтобы пользователь перенаправлялся с устаревшего URL-адреса на / artist / Madonna

Спасибо!

Ответы [ 2 ]

6 голосов
/ 04 мая 2009

в зависимости от статьи, которую вы упомянули, вот шаги для этого:

1 - Ваш LegacyHandler должен извлечь значения маршрутов из строки запроса (в данном случае это идентификатор исполнителя) Вот код для этого:

 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, где у вас есть ArtistController с действием ViewArtist, которое принимает параметр id типа int

    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

0 голосов
/ 12 октября 2012

Я немного боролся с этим, пока не обдумал это. Это было намного проще сделать в контроллере, как это сделал Перхентиан, тогда непосредственно в конфигурации маршрута, по крайней мере, в моей ситуации, так как наши новые 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 вручную.

...