tag route page net mvc from data asp all c# asp.net-mvc routing

c# - route - Enrutamiento de enlaces legacy asp.net en un proyecto asp.net mvc



migrating from asp net mvc to asp net core mvc (3)

¿Qué le parece agregar una ruta de página de Mapa?

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

Luego, usando esto en su aspx / vista

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

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

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

URL heredadas de enrutamiento ASP.Net MVC que pasan identificadores de cadena de comandos a acciones de controlador

Al tratar de seguir esto, puedo obtener la primera url para que funcione, pero luego todas las demás url están rotas. ¿Alguien puede ver mi error?

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


Esto es lo que terminé haciendo para resolver mi problema hasta que vi la respuesta simple @grenade publicada. 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()); }


Puede crear un archivo llamado d.aspx en la raíz de su sitio con un contenido similar al siguiente:

<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>