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