2013-12-19 133 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

感謝您的回答,我仍在努力解決,我將很快編輯我的問題 –