2013-09-02 1 views
1

У меня есть простой проект ASP.NET WebForms с несколькими страницами, и я бы хотел использовать дружественные URL (не только для SEO, но и для локализации URL-адресов). Я использую .NET 4.5 для этого проекта и пытался использовать пакет Microsoft.AspNet.FriendlyUrls nuget, который выглядел так, как будто он может помочь. Но есть одна проблема.ASP.NET WebForms: Request.GetFriendlyUrlFileVirtualPath() возвращает пустую строку

У меня в Global.asax это:

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

и RouteConfig класс выглядит следующим образом:

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

Я хочу, чтобы показать ту же страницу, если вы к нему доступ через обе/HowItWorks и/ako-to-funguje (это словацкий язык).

И теперь я приближаюсь к актуальной проблеме. Когда я обращаюсь к сайту с одним из локализованных маршрутов (например,/ako-to-funguje), Request.GetFriendlyUrlFileVirtualPath() возвращает пустую строку (но я хочу получить «~/HowItWorks.aspx», на которой я хочу сделать что-то в главном страница).

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

Если я получить доступ к сайту с/HowItWorks URL затем Request.GetFriendlyUrlFileVirtualPath() возвращает "~/HowItWorks.aspx", как и ожидалось.

Любая идея, как получить «~/HowItWorks.aspx» из Request.GetFriendlyUrlFileVirtualPath() при доступе к сайту через/HowItWorks и/ako-to-funguje?

ответ

1

В конце концов я придумал обходное решение этой проблемы. Я создал собственный метод расширения для запроса HTTP, который возвращает виртуальный путь к файлу в настоящее время выполняется страница:

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; 
      } 
    } 
} 
+0

Спасибо Петрик, это отличное решение. Я пытался найти способ решения подобной проблемы в течение нескольких дней (см. Http://stackoverflow.com/q/22577826/236860), и это работает отлично. – Neilski

+0

Это не работает, если у вас есть параметры в URL-адресе или если вы используете виртуальный каталог – Mike

0

Пожалуйста, свяжитесь с

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

Я обновил ответ Petriq для обработки параметров в 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; 
    } 

Маршруты теперь могут быть

RouteValueDictionary contactDefault = new RouteValueDictionary { { "person", UrlParameter.Optional } }; 

routes.MapPageRoute("Contact", "kontakt/{person}", "~/Contact.aspx"); 

 Смежные вопросы

  • Нет связанных вопросов^_^