2011-01-12 38 views
5

我們的舊ASP.net站點將靜態圖像存儲在根目錄下的子目錄中,名爲/images永久重定向在ASP.Net中靜態文件的傳統路由MVC

我們新的ASP.net MVC網站/內容的新佈局存儲這些圖片/圖片

我已經改變了所有的網頁在現場,以應付新的文件夾結構,但我d喜歡從舊靜態圖像到新位置設置永久重定向。

我們的網站是託管的,我無法控制IIS,那麼解決此問題的最佳方法是什麼?

+1

事實證明,我的虛擬主機也讓我有控制IIS,因此我能夠使用Url重寫模塊來完成我的要求。但是,如果社區爲那些處於我認爲自己所處狀態的人提供了答案,我將留下此問題。 – 2011-01-18 23:25:51

回答

6

我用下面的代碼爲我的MVC 2網站:

// The legacy route class that exposes a RedirectActionName 
public class LegacyRoute : Route 
{ 
    public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler) 
     : base(url, routeHandler) 
    { 
     RedirectActionName = redirectActionName; 
     Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index"}); // is not actually called 
    } 

    public string RedirectActionName { get; set; } 
} 

// The legacy route handler, used for getting the HttpHandler for the request 
public class LegacyRouteHandler : MvcRouteHandler 
{ 
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     requestContext.HttpContext.Response.Write("success"); 
     return new LegacyHandler(requestContext); 
    } 
} 

// The legacy HttpHandler that handles the request 
public class LegacyHandler : MvcHandler 
{ 
    public LegacyHandler(RequestContext requestContext) : base(requestContext) 
    { 
     requestContext.HttpContext.Response.Write("success"); 
     ProcessRequest(requestContext.HttpContext); 
    } 

    protected override void ProcessRequest(HttpContextBase httpContext) 
    { 
     string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName; 
     var route = new Route(redirectActionName, ((LegacyRoute)RequestContext.RouteData.Route).Defaults, new MvcRouteHandler()); 

     // Copy all of the querystring parameters and put them within RouteContext.RouteData.Values 
     var values = new Dictionary<string, object>(); 
     foreach (var s in RequestContext.RouteData.Values) 
     { 
      values.Add(s.Key, s.Value); 
     } 
     foreach (var s in httpContext.Request.QueryString.AllKeys) 
     { 
      values.Add(s, httpContext.Request.QueryString[s]); 
     } 
     var data = route.GetVirtualPath(RequestContext, new RouteValueDictionary(values)); 

     httpContext.Response.Status = "301 Moved Permanently"; 
     httpContext.Response.AppendHeader("Location", "/" + data.VirtualPath + "/"); 
     httpContext.Response.End(); 
    } 
} 

然後,我只是傳統的路由添加到我的路線圖:

routes.Insert(13, new LegacyRoute("search", "search/{query}", new LegacyRouteHandler())); 
+0

+1您如何使用此代碼?你在哪裏爲LegacyHandler,MVC3創建.cs文件?這將如何工作重定向URL的:〜/ products.aspx?id = 1 – Picflight 2011-02-21 12:38:30