2010-01-18 13 views
7

Ho il seguente URL che ho bisogno di supportare nel mio progetto asp.net mvc per un po '.routing collegamenti legacy asp.net in un progetto aspvc mvc

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

Ho bisogno di mappare questo a questo URL.

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

Ho già visto le seguenti informazioni.

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

Nel tentativo di seguire questa posso ottenere il primo URL a lavorare, ma poi di sono rotti tutti gli altri url. Qualcuno può vedere il mio dove ho sbagliato?

Ecco i miei percorsi.

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

Ecco il codice nel mio global.asax.cs Sto 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

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

+0

@ marwan-auida Si prega di leggere il contenuto della domanda. Ho già visto e letto questa domanda e ho anche un link ad esso nella mia domanda. – MHinton

+0

Quello che intendo per il mio url è rotto è prima che aggiungo il codice LegacyRouteHandler che ho avuto link come http://www.example.com/News e ora vengono su http://www.example.com/d.aspx? action = Index & regolatore = News. – MHinton

risposta

4

Si potrebbe semplicemente creare un file chiamato d.aspx nella root del sito con contenuti simili a quanto segue:

<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 Mi piace questo è la risposta più semplice che ho visto a questo problema. – MHinton

+0

Dato che questo è anche per scopi SEO, raccomando il metodo RedirectPermanent. http://msdn.microsoft.com/en-us/library/system.web.httpresponse.redirectpermanent.aspx – Venemo

2

Ecco quello che ho finito per fare per risolvere il mio problema fino a quando ho visto la risposta semplice @grenade pubblicata. Ho trovato questa tecnica qui 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

ne dite di aggiungere un percorso pagina Mappa:

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

Quindi, utilizzando questo nel tuo aspx/vista

Html.RouteLink("MyLinkName", "Legacy") 
Problemi correlati