AbsolutePageUrl

18 listopada 2009 06:59 w kategorii: pro
Tagi:

Problem wydaje się banalny i głupi. Jeżeli istnieje jego proste rozwiązanie to znaczy że JA jestem głupi. I banalny.

Chodzi o wygenerowanie w zwykłej własnej klasie linka do jakiejś strony w naszej witrynie. Nie po stronie aspx, nie w kontrolerze... po prostu GDZIEŚ.

Przez długi czas działała taka konstrukcja: HttpContext.Current.Request.ApplicationPath + "/MyPage/". Jednak jak to bywa, okazało się że nie jest ona idealna. Wystarczyło skonfigurować aplikację tak, aby była domyślną WebSite serwowaną przez IIS (czyli np. dostępna pod adresem http://localhost) i pojawiły się problemy - przedstawione instrukcje zwracały adres http://MyPage, a czegoś takiego oczywiście nie ma (a nawet jeśli przypadkiem jest, to nie o to nam chodzi:) ).

Po dość długiej randce z Googlem (który nie okazał się zbyt pomocny) i Reflectorem (szczególnie skupiłem się na metodzie Response.Redirect()) powstała taka metoda:

  1:  public static string CreateAbsolutePageUrl(string virtualUrl)
  2:  {
  3:  	return new Uri(
  4:  		HttpContext.Current.Request.Url,
  5:  		HttpContext.Current.Response.ApplyAppPathModifier(virtualUrl)
  6:  	).AbsoluteUri;
  7:  }

Ma ktoś pomysł jak to inaczej osiągnąć poprawne w każdej sytuacji generowanie absolutnych adresów z np. takiego stringa: "~/MyPage"?


Komentarze

dotnetomaniak.pl

18 listopada 2009 02:10

Trackback from dotnetomaniak.pl

Maciej Aniserowicz | AbsolutePageUrl

Radek

18 listopada 2009 11:55

Użyj ResolveUrl

procent

18 listopada 2009 12:04

@Radek:
new Control().ResolveUrl(virtualPath) zwraca to samo co moje wcześniejsze podejście - zatem nie ok.

Gutek

18 listopada 2009 12:39

ty a tak poza tym, to co chcesz osiagnac:

adres:
http://host/my/url/MyPage

bo nie wiem czemu piszac aplikacje webowa potrzebujesz zwracac sobie hosta - ale pewnie masz powod i to dobry :) daj znac, bo nie ma sensu pisac X rozwiazac, ktore nie zalatwiaja Ci tego co chcesz :)

Gutek

procent

18 listopada 2009 13:02

@Gutek:
Adres w tej postaci wysyłam w html. Po stronie klienta m.in. w odpowiedzi na pewne zdarzenie w javascript zmieniam aktualna lokalizacje:

window.location.href = 'absolute_url'

Tak jak napisalem problem pojawia sie gdy aplikacja jest ustawiona jako domyslna witryna na IIS.

apl

18 listopada 2009 15:57

W takiej sytuacji nie jest potrzebny bezwzględny adres URL — wystarczy bezwzględna ścieżka. Coś takiego:

window.location.href = '/MyApplication/Default.aspx';

zadziała równie dobrze. Ścieżkę tej postaci można uzyskać z dowolnego miejsca bez większych problemów:

string absolutePath = VirtualPathUtility.ToAbsolute("~/Default.aspx");

procent

18 listopada 2009 17:17

@apl:
Dzięki, zadziałało to zarówno w tym, jak i w innych (mniejsza o to jakich) scenariuszach. VirtualPathUtility próbowałem wykorzystywać, ale widocznie po drodze popełniłem jakiś błąd.

Gutek

18 listopada 2009 17:27

@apl

no wlasnie dlatego sie pytalem % :) hehe

Gutek

Darek

19 listopada 2009 11:27

http://www.codeplex.com/FileDirectoryPath armata na wróble, ale tak przy okazji tematu jak ktoś nie zna....

Darek

19 listopada 2009 11:29

^
| z tym ze http://www.codeplex.com/FileDirectoryPath dotyczy operacji plikowych

Komentarze zamknięte