Asp.net legacy link routing in asp.net mvc project

I have the following url that I need to maintain in my asp.net mvc project for a while.

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

I need to map this to this URL.

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

I have already reviewed the following information.

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

ASP.Net MVC Routing Legacy URLs Passing a Request Request Identifiers for Controller Actions

Trying to follow this, I can get the first url to work, but then all the other urls are broken. Can anyone see mine where I did wrong?

Here are my routes.

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

Here is the code in my global.asax.cs that I use.

  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); } } } 
+7
c # asp.net-mvc routing
source share
3 answers

You can simply create a file called d.aspx in the root of your site with content similar to the following:

 <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> 
+4
source share

Here is what I did to solve my problem until I saw a simple @grenade answer. I found this technique here 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()); } 
+2
source share

How to add map page route:

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

Then using this in your aspx / view

 Html.RouteLink("MyLinkName", "Legacy") 
0
source share

All Articles