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.