fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Wyłuskiwanie RouteData (akcja, kontroler…) z URL w MVC 3


02.08.2011

Ciekawostka: jak uzyskać RouteData z czystego URLa? Nie taka prosta sprawa…

Ale najpierw: po co? Tutaj odpowiedź banalna: aby umożliwić wykorzystanie opisanego niedawno mechanizmu w sytuacji, gdy mamy całą strukturę menu zdefiniowaną na zewnątrz aplikacji (np. w bazie danych). Struktura taka mogłaby zawierać wygodne pary kontroler/akcja (+ew. area) i wtedy nie ma problemu, ale jeśli jest inaczej – to trzeba się uciec do tematu niniejszego posta.

Przykład wykorzystania docelowego rozwiązania:

  1:  UrlToRouteConverter.GetRouteData("~/Wszystkie-newsy");

A oto kod, który powyższą linijkę przetłumaczy na instancję klasy RouteData z wypełnionymi słownikami:

  1:  public static class UrlToRouteConverter
  2:  {
  3:      public static RouteData GetRouteData(string url)
  4:      {
  5:          return RouteTable.Routes.GetRouteData(new OwnedContext(url));
  6:      }
  7:  
  8:      private class OwnedRequest : HttpRequestBase
  9:      {
 10:          private readonly string appRelativeUrl;
 11:  
 12:          public OwnedRequest(string appRelativeUrl)
 13:          {
 14:              this.appRelativeUrl = appRelativeUrl;
 15:          }
 16:  
 17:          public override string AppRelativeCurrentExecutionFilePath
 18:          {
 19:              get { return appRelativeUrl; }
 20:          }
 21:  
 22:          public override string PathInfo
 23:          {
 24:              get { return string.Empty; }
 25:          }
 26:      }
 27:  
 28:      private class OwnedContext : HttpContextBase
 29:      {
 30:          private readonly HttpRequestBase mockHttpRequestBase;
 31:  
 32:          public OwnedContext(string appRelativeUrl)
 33:          {
 34:              this.mockHttpRequestBase = new OwnedRequest(appRelativeUrl);
 35:          }
 36:  
 37:          public override HttpRequestBase Request
 38:          {
 39:              get { return mockHttpRequestBase; }
 40:          }
 41:      }
 42:  }

P.S. Oryginalny kod znaleziony na StackOverflow.

Comments are closed.

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również