2013-12-19 108 views
1

假设我们想要将旧版本的asp.net web表单转换为mvc体系结构。 但有些用户已将我们的网址加入书签,或者他们已将其链接到其他网站。 现在我们不想松散那些urls.indd我们想创建一个管理旧类型的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

感谢您的回答,我仍在努力解决,我将很快编辑我的问题 –