2010-01-18 22 views
7

Tengo la siguiente URL Necesito ayuda en mi proyecto asp.net mvc por un tiempo.enrutamiento enlaces legacy asp.net en un proyecto asp.net mvc

http://www.example.com/d.aspx?did=1234 

Necesito asignar esto a esta url.

http://www.example.com/Dispute/Detail/1234 

Ya he visto la siguiente información.

http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

ASP.Net MVC routing legacy URLs passing querystring Ids to controller actions

Al tratar de seguir este puedo conseguir el primer url para trabajar, pero luego se rota de todas las demás URL. ¿Alguien puede ver dónde he salido mal?

Aquí están mis rutas.

public static void RegisterRoutes(RouteCollection routes) 
    { 
     // all my other routes 

     // Legacy routes 
     routes.Add(
      "Legacy", 
      new LegacyRoute(
      "d.aspx", 
      "LegacyDirectDispute", 
      new LegacyRouteHandler()) 
     ); 

     routes.MapRoute(
      "LegacyDirectDispute", 
      "Dispute/Details/{id}", 
      new { controller = "Dispute", action = "Details", id = "" } 
     ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",      // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 
    } 

Aquí hay un código en mi global.asax.cs que estoy usando.

public class LegacyRoute : Route 
{ 
    public string RedirectActionName { get; set; } 
    public LegacyRoute(string url, string redirectActionName, IRouteHandler routeHandler) 
    : base(url, routeHandler) 
    { 
    RedirectActionName = redirectActionName; 
    } 
} 

// The legacy route handler, used for getting the HttpHandler for the request 
public class LegacyRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
    return new LegacyHandler(requestContext); 
    } 
} 

// The legacy HttpHandler that handles the request 
public class LegacyHandler : MvcHandler 
{ 
    private RequestContext requestContext; 
    public LegacyHandler(RequestContext requestContext) 
    : base(requestContext) 
    { 
    this.requestContext = requestContext; 
    } 

    protected override void ProcessRequest(HttpContextBase httpContext) 
    { 
    string redirectActionName = ((LegacyRoute)RequestContext.RouteData.Route).RedirectActionName; 

    var queryString = requestContext.HttpContext.Request.QueryString; 
    foreach (var key in queryString.AllKeys) 
    { 
    if (key.Equals("did")) 
    { 
    requestContext.RouteData.Values.Add("id", queryString["did"]); 
    } 
    else 
    { 
    requestContext.RouteData.Values.Add(key, queryString[key]); 
    } 
    } 

    VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName, 
       requestContext.RouteData.Values); 

    if (path != null) 
    { 
    httpContext.Response.Status = "301 Moved Permanently"; 
    httpContext.Response.AppendHeader("Location", path.VirtualPath); 
    } 
    } 
} 
+0

contestadas aquí: http://stackoverflow.com/questions/817325/asp-net-mvc-routing-legacy-urls-passing-querystring-ids-to-controller-actions/818370 # 818370 –

+0

@ marwan-auida Por favor, lea el contenido de la pregunta. Ya he visto y leído esa pregunta SO e incluso tengo un enlace a ella en mi pregunta. – MHinton

+0

Lo que quiero decir con la ruptura de mi URL es antes de agregar el código de LegacyRouteHandler. Tenía vínculos como http://www.example.com/News y ahora aparecen en http://www.example.com/d.aspx. acción = Índice y controlador = Noticias. – MHinton

Respuesta

4

Se podía crear un archivo llamado d.aspx en la raíz de su sitio con contenidos similares a los siguientes:

<script runat="server"> 
protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Redirect(string.Format("http://{0}/Dispute/Detail/{1}", Request.Url.Host, Request.QueryString.Get("did"))); 
} 
</script> 
+0

@grenade Me gusta esta es la respuesta más simple que he visto a este problema. – MHinton

+0

Dado que esto también es para fines de SEO, recomiendo el método RedirectPermanent. http://msdn.microsoft.com/en-us/library/system.web.httpresponse.redirectpermanent.aspx – Venemo

2

Esto es lo que terminé haciendo para resolver mi problema hasta que vi la respuesta simple @grenade publicado. Encontré esta técnica aquí http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC.

public class LegacyUrlRoute : RouteBase 
{ 
    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     const string status = "301 Moved Permanently"; 
     var request = httpContext.Request; 
     var response = httpContext.Response; 
     var legacyUrl = request.Url.ToString(); 
     var newUrl = ""; 
     var id = request.QueryString.Count != 0 ? request.QueryString[0] : ""; 

     if (legacyUrl.Contains("d.aspx")) 
     { 
      newUrl = "Dispute/Details/" + id; 
      response.Status = status; 
      response.RedirectLocation = newUrl; 
      response.End(); 
     } 
     return null; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, 
       RouteValueDictionary values) 
    { 
     return null; 
    } 
} 

public static void RegisterRoutes(RouteCollection routes) 
{ 
    // all my other routes 
    routes.Add(new LegacyUrlRoute()); 
} 
0

Cómo sobre la adición de una ruta página Mapa:

Routes.MapPageRoute(
      "Legacy", // Route name 
      "d.aspx", // URL 
      "~/pathfromBaseUrl/d.aspx" // File 
      ); 

Luego, utilizando esto en su aspx/vista

Html.RouteLink("MyLinkName", "Legacy") 
Cuestiones relacionadas