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