2010-08-25 17 views
6

Mam stronę w mojej witrynie, dla celów tego przykładu powiedzmy, http://myhost/Pages/Default.aspx. W Default.aspx Mam kontrolę użytkownika o nazwie MyControl.ascx, która mieszka w /Controls/MyControl.ascx. Więc drzewo wyglądać takHiperłącze względem bieżącego adresu URL, a nie ścieżka kontroli użytkownika

  • korzenia
    • Pages
      • Defalult.aspx
    • Sterowanie
      • MyControl.ascx

Ilekroć umieścić kontrolę hiperłącza na MyControl.ascx i określ NavigateUrl ta ścieżka jest w stosunku do kontroli, a nie adres URL strony. Na przykład, jeśli w NavigateUrl podaję "AboutMe.aspx", URL będzie renderowany jako http://myhost/Controls/AboutMe.aspx zamiast http://myhost/Pages/AboutMe.aspx. Czy istnieje sposób, w jaki mogę zrobić to w odniesieniu do adresu URL strony? Próbowałem rozwiązanie tutaj: Relative path from an ASP.NET user control NavigateUrl, ale to nie działa dla mnie.

Edit

Dla wyjaśnienia, chciałbym to być wystarczająco rodzajowy tak, że gdybym nie wiedział, co ścieżka była rozwiązaniem będzie działać. Więc tak naprawdę nie chcę harcować "~/Pages/Default.aspx" w NavigateUrl

+0

Proszę udostępnić zaktualizowany kod kontrolki HyperLink. Mam do czynienia z tym samym problemem, a miejsca, w których korzystam z kontroli, nie są stałe. Więc nie mogę zakodować adresu URL '~ \ xyx \ xyz \ myControl.aspx?'. Chcę uzyskać względny URL z mojej strony. –

+0

dziękuję za odpowiedź, już rozwiązałem problem na moim koniec. Dla innych, którzy trafiają na tę stronę za pośrednictwem Google, oto co zrobiłem: Użyłem linków z katalogu głównego za pomocą "/pathtopage/page.xyz" –

Odpowiedz

5

Masz kilka opcji:

  1. Można zakodować URL za pomocą ~ operator, który daje root, a następnie zdefiniuj go stamtąd, jak: ~/Pages/AboutMe.aspx. Należy pamiętać, że operator ~ jest rozpoznawany tylko dla kontroli serwera i kodu serwera.

  2. Można też użyć .. aby dostać się do miejsca, gdzie chcesz, jak to będzie poruszać się z powrotem w górę strukturze folderów jak: ../Pages/AboutMe.aspx

  3. można utworzyć metody pomocnika wrócić Ci ważnego pierwiastka do swoich stron folder, obrazy, JavaScript, itp ...

  4. Na stronie HttpRequest.ApplicationPath otrzymasz ścieżkę główną aplikacji wirtualnej na serwerze, której możesz użyć do kompilacji.

Aby uzyskać więcej informacji na temat opcji pathing powinieneś przeczytać ten artykuł na MSDN:

ASP.NET Web Project Paths

EDIT: W oparciu o edycję swoje pytanie, należy następnie przekazać we względnej zawartości do ciebie kontrola użytkownika za pośrednictwem właściwości. Niech strona, która używa kontrolki, definiuje względną ścieżkę do zasobu, którego będzie potrzebować.

+0

@ Kyle czy masz inne wymagania, które sprawią, że przekazanie adresu URL, którego chcesz używać nie działa? – Kelsey

+0

Nie, to chyba najlepsze dla mnie rozwiązanie. Przepraszam za opóźnienie. – Kyle

+0

Czy możesz podać przykład tego, co rozumiesz przez swoją edycję? – xr280xr

0

Jak ustawić NavigateUrl hiperłącza? Jeżeli ustawić go za pomocą znaku ~, to działa zgodnie z oczekiwaniami:

MyControl.ascx

<asp:HyperLink runat="server" NavigateUrl="~/Pages/Default.aspx" ... > 
2

Najlepszym sposobem osiągnięcia tego celu jest wykorzystanie

string.Format("{0}", Page.Request.Url.PathAndQuery); 

w nieruchomości NavigateUrl

+0

Daje to wersję do przepisania innego niż adres URL, a także opublikowane dane. – TamusJRoyce

0

Just in case ktoś jeszcze potyka się na to jak ja ...

W kodzie tyłu, Ustawiłem NavigateUrl na:

link.NavigateUrl = Page.ResolveUrl("aboutus.aspx"); 
0

Prostsze niż to. Wystarczy zmienić właściwość AppRelativeTemplateSourceDirectory kontrolki użytkownika na wartość tej samej właściwości strony nadrzędnej.

protected override void OnInit(EventArgs e) 
{ 
    AppRelativeTemplateSourceDirectory = Page.AppRelativeTemplateSourceDirectory; 
    base.OnInit(e); 
} 

wtedy wszystkie względne ścieżki w kontroli użytkownika będą miały miejsce, jeśli były na stronie.

Powiązane problemy