2011-01-12 19 views
5

Nasza stara witryna ASP.net zapisała statyczne obrazy w katalogu podkatalogu w katalogu głównym o nazwie /images.Trwałe przekierowanie Starsze trasy dla plików statycznych w ASP.Net MVC

Nasza nowa strona ASP.net MVC przechowuje te obrazy w nowym układzie /content/Obrazy

Zmieniłem wszystkich stron w witrynie, aby poradzić sobie z nową strukturą folderów, ale I” c chcesz ustawić stałe przekierowania ze starych statycznych obrazów do nowej lokalizacji.

Nasza strona jest hostowana, a ja nie mam kontroli nad IIS, więc jakie jest najlepsze rozwiązanie tego problemu?

+1

Okazuje się, że mój hostingowego nie pozwól mi mieć kontroli nad usługami IIS, dlatego mogłem użyć modułu do przebudowy Url, aby spełnić moje wymagania. Pozostawiam jednak to pytanie na wypadek, gdyby społeczność dostarczyła odpowiedź tym, którzy są w sytuacji, o której myślałem, że jestem. –

Odpowiedz

6

używam następujący kod do moich MVC 2 stron:

// 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(); 
    } 
} 

Potem wystarczy dodać starszych tras do mojego Mapa tras:

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

+1 W jaki sposób korzystasz z tego kodu? Gdzie tworzysz plik .cs dla LegacyHandler, MVC3? Jak to działa, aby przekierować adresy URL jako: ~/products.aspx? Id = 1 – Picflight

+0

Dodałbym wiersz 'httpContext.Response.StatusCode = 301;'. Ja również ** musiałem usunąć kod, aby dodać ukośnik na końcu **, ponieważ łamał on moje parametry adresu URL z '? Foo = bar' na'? Foo = bar/', a następnie moja Akcja spowodowałaby błąd, ponieważ 'bar /' nie jest poprawną wartością 'foo'. – ANeves

+0

Istnieje artykuł na blogu z tym kodem (lub bardzo podobnym), który wyjaśnia bardziej szczegółowo użycie - http://www.eworldui.net/blog/post/2008/04/aspnet-mvc---legacy-url-routing.aspx –

Powiązane problemy