validar vacio querystring query empty ejemplo aspx c# asp.net webforms seo friendly-url

vacio - response.redirect c#



WebForms de ASP.NET: Request.GetFriendlyUrlFileVirtualPath() devuelve una cadena vacĂ­a (3)

Tengo un proyecto sencillo de ASP.NET WebForms con solo unas pocas páginas y me gustaría utilizar URL amigables (no solo para SEO sino también para la localización de URL). Uso .NET 4.5 para este proyecto y he tratado de usar el paquete nuget Microsoft.AspNet.FriendlyUrls, que parecía que podría ser útil. Pero hay un problema.

Tengo en Global.asax esto:

void Application_Start(object sender, EventArgs e) { // Code that runs on application startup BundleConfig.RegisterBundles(BundleTable.Bundles); RouteConfig.RegisterRoutes(RouteTable.Routes); }

y la clase RouteConfig se ve así:

public static class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("HowItWorks", "ako-to-funguje", "~/HowItWorks.aspx"); routes.MapPageRoute("AboutUs", "o-nas", "~/AboutUs.aspx"); routes.MapPageRoute("Contact", "kontakt", "~/Contact.aspx"); var settings = new FriendlyUrlSettings(); settings.AutoRedirectMode = RedirectMode.Permanent; routes.EnableFriendlyUrls(settings); } }

Deseo mostrar la misma página si accede a ella a través de / howItWorks y / ako-to-funguje (que es la configuración regional eslovaca).

Y ahora me estoy acercando al problema real. Cuando accedo al sitio con una de las rutas localizadas (por ejemplo, / ako-to-funguje), Request.GetFriendlyUrlFileVirtualPath () devuelve una cadena vacía (pero quiero obtener "~ / HowItWorks.aspx" sobre el que quiero hacer algunas cosas en el maestro página).

string pageFileName = Request.GetFriendlyUrlFileVirtualPath(); switch (pageFileName) { case "~/AboutUs.aspx": //do some stuff break; case "~/HowItWorks.aspx": //do some stuff break; case "~/Contact.aspx": //do some stuff break; default: break; }

Si accedo al sitio con / HowItWorks URL, Request.GetFriendlyUrlFileVirtualPath () devuelve "~ / HowItWorks.aspx" como se esperaba.

¿Alguna idea de cómo obtener "~ / HowItWorks.aspx" de Request.GetFriendlyUrlFileVirtualPath () al acceder al sitio a través de / HowItWorks y / ako-to-funguje?


Al final, he encontrado una solución para este problema. Creé un método de extensión propio para la solicitud http que devuelve la ruta del archivo virtual a la página ejecutada actualmente:

using System.Web; using System.Web.Routing; using Microsoft.AspNet.FriendlyUrls; namespace Utils.Extensions { public static class HttpRequestExtensions { public static string GetFileVirtualPathFromFriendlyUrl(this HttpRequest request) { string ret = string.Empty; ret = request.GetFriendlyUrlFileVirtualPath(); if (ret == string.Empty) { foreach (RouteBase r in RouteTable.Routes) { if (r.GetType() == typeof(Route)) { Route route = (Route)r; if ("/" + route.Url == request.Path) { if (route.RouteHandler.GetType() == typeof(PageRouteHandler)) { PageRouteHandler handler = (PageRouteHandler)route.RouteHandler; ret = handler.VirtualPath; } break; } } } } return ret; } } }


Por favor verifique con

string requestUrl = this.Request.GetFriendlyUrlFileVirtualPath().ToLowerInvariant(); if (String.IsNullOrEmpty(requestUrl)) { requestUrl = this.Request.AppRelativeCurrentExecutionFilePath.ToLowerInvariant(); }


Actualicé la respuesta de Petriq para manejar parámetros en la url

public static string GetFileVirtualPathFromFriendlyUrl(this HttpRequest request) { string ret = request.GetFriendlyUrlFileVirtualPath(); if (ret == string.Empty) { for(int j = 0, a = RouteTable.Routes.Count; j<a;j++) { RouteBase r = RouteTable.Routes[j]; if (r.GetType() == typeof(Route)) { Route route = (Route)r; StringBuilder newroute = new StringBuilder(route.Url); if (route.Defaults != null && route.Defaults.Count > 1) { string[] keys = route.Defaults.Select(x => x.Key).ToArray(); foreach (string k in keys) { newroute = newroute.Replace("{" + k + "}", k.CheckQueryString()); } } if (String.Compare(newroute.ToString(), request.Path.Replace(request.ApplicationPath, ""), true) == 0) { if (route.RouteHandler.GetType() == typeof(PageRouteHandler)) { PageRouteHandler handler = (PageRouteHandler)route.RouteHandler; return handler.VirtualPath; } } } } } return ret; }

Las rutas ahora pueden ser

RouteValueDictionary contactDefault = new RouteValueDictionary { { "person", UrlParameter.Optional } }; routes.MapPageRoute("Contact", "kontakt/{person}", "~/Contact.aspx");