2013-12-19 23 views
1

Предположим, что мы хотим преобразовать старую версию веб-форм asp.net в mvc-архитектуру. Но некоторые пользователи отметили наши URL-адреса или у них есть ссылка на другие сайты. Теперь мы не хотим потерять этот urls.instead, мы хотим создать настраиваемый маршрут, который управляет старыми типизированными URL-адресами. Этот класс получает старый URL-адрес от пользователя и создает новый маршрут и перенаправляет пользователя на новую страницу. Это мой пользовательский класс по маршруту:Конфигурация настраиваемого маршрута mvc

public class LegacyRoute:RouteBase 
{ 
    private string[] urls; 
    public LegacyRoute(params string[] targetUrls) 
    { 
     urls = targetUrls; 
    } 
    public override RouteData GetRouteData(HttpContextBase httpContext) 
{ 
RouteData result = null; 
string requestedURL = 
    httpContext.Request.AppRelativeCurrentExecutionFilePath; 
     if (urls.Contains(requestedURL,StringComparer.OrdinalIgnoreCase)) 
     { 
      result = new RouteData(this, new MvcRouteHandler()); 
      result.Values.Add("controller", "Legacy"); 
      result.Values.Add("action", "GetLegacyUrl"); 
      result.Values.Add("legacyUrl", requestedURL); 
     } 
     return result; 
} 
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     return null; 
    } 
} 

и это моя RegisterRoutes функция:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     // routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.Add(new LegacyRoute("~/articles/windows_3.1_Overview.html", "~/old/.NET_1.0_Class_Library")); 
     routes.MapRoute(null, "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

    } 

Я также создал «Наследие» контроллер и действие «GetLegacyUrl». Но когда я запускаю сайт и введите

"localhost:14786/articles/windows_3.1_Overview.html" 

в моем браузере я получаю 404 Not Found ошибка. Где проблема? Почему я получаю эту ошибку?

ответ

0

Я решил эту проблему (в Restful Routing), создав глобальный атрибут, который выглядит на трассе и затем выполняет перенаправление, если он понимает, что маршрут является «перенаправлять маршрут». В вашем случае это будет LegacyRoute.

public class RedirectFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.IsChildAction) 
      return; 

     var redirect = filterContext.RouteData.Route as RedirectRoute; 
     if (redirect != null) 
     { 
      var helper = new UrlHelper(filterContext.RequestContext); 
      var values = new RouteValueDictionary(filterContext.RequestContext.RouteData.Values); 
      var merged = new RouteValueDictionary(redirect.DataTokens["new_path"] as RouteValueDictionary); 

      // keep the values we specified, and add the other routeValues 
      // that we we didn't have overrides for. 
      foreach (var key in values.Keys.Where(key => !merged.ContainsKey(key))) 
       merged.Add(key, filterContext.RouteData.Values[key]); 

      var url = helper.RouteUrl(filterContext.RouteData.Values); 
      filterContext.Result = new RedirectResult(url, redirect.IsPermanent); 
     } 
    } 
} 
+0

большое спасибо за вашу помощь. –

+0

, пожалуйста, дайте мне знать, если он действительно решит вашу проблему, и если да, то отметьте мой ответ как правильный :) –

+0

, к сожалению, этого не произошло. –

0

Я знаю, что это похоже на месяц, но в вашем посте вы не указали точку зрения. Какое мнение вы ожидаете от пользователя? Каково мнение, что контроллер возвращается в результате GetLegacyUrl? Если есть вид, который сохраняется, GetLegacyUrl, то вы не получите 404. Исходный код, который вы опубликовали, в порядке.

+0

спасибо за ваш ответ, я все еще работаю над этим, и я скоро отредактирую свой вопрос –

Смежные вопросы