2011-01-06 15 views
16

To nie jest dokładnie ostatnie twierdzenie Fermata, ale wciąż wraca, by mnie drażnić niczym niezapłacony rachunek telefoniczny ze studiów. Czasami chcę utworzyć HyperLink, który nie powoduje odświeżenia, dlatego chcę, aby docelowy adres URL był #. Gdy znacznik pochodzi z elementu UserControl w podfolderze, adres URL zostanie przepisany za pomocą ścieżki względnej, np. Z kontrolki UserControl w podfolderze.NavigateUrl = "#" staje się href = "SubFolder/#"?

<asp:HyperLink runat="server" NavigateUrl="#" >Click Me!</asp:HyperLink> 

staje

<a href="SubFolder/#">Click Me!</a> 

Który jest, niestety, źle. Oczywiście mogę obejść to, nie używając kontroli serwera, ale wydaje się to głupie. Czy można tego uniknąć?

Chodzi o to, że dodam zdarzenie click z jQuery lub z kodem, i nigdy nie chcę, aby powodowało odświeżenie, ale chcę, aby był to hiperlink z powodów CSS.

+0

Możesz anulować nawigację za pomocą obiektu zdarzenia. function (e) {e.preventDefault(); }. Jeśli zamierzasz użyć jQuery do wiązania jakiegoś zdarzenia, nie ma sensu używanie kontrolki serwera. – BrunoLM

+0

W tym konkretnym przypadku logika na serwerze kontroluje widoczność łącza, a także określony kod zdarzenia javascript. Oczywiście są sposoby obejścia tego problemu (np. Po prostu umieszczam go w symbolu zastępczym i używam znaczników <% %> do definiowania zdarzenia kliknięcia w znacznikach), ale wydaje się to głupie, że musiałbym zrobić jedną z tych rzeczy (użyj javascript, aby zapobiec nawigacji i/lub nie używają kontroli serwera) do zrobienia czegoś tak podstawowego, że można to zrobić znacznie bardziej elegancko dzięki kontroli serwera, która działała prawidłowo. –

Odpowiedz

11

łatwy sposób:

<asp:HyperLink ID="HyperLink1" 
       navigateUrl="#" 
       onclick="javascript:return false;"     
       runat="server">HyperLink</asp:HyperLink> 

lub

<asp:HyperLink ID="HyperLink1" 
       href="#" 
       runat="server">HyperLink</asp:HyperLink> 

lub jQuery dodać klasę do łącza nie chcesz mieć odświeżenie (nopostback):

$("a.nopostback").bind('click', function() { 
    return false; 
}) 
+1

Druga opcja działa. Pierwszy nie działa. Ostatnie stwierdzenie, że tak naprawdę nie pasuje do jego przypadku. – BrunoLM

+4

# 2 to odpowiedź ... która z perspektywy czasu wydaje się tak oczywista! Dzięki!Tylko dla zapisu, "NavigateUrl =" ./# "' nadal wyświetla jako "href =" Edytowany podfolder/# "' –

+0

edytowane, pierwsza odpowiedź nie miała sensu, była małą pozostałością eksperymentu, przepraszam za niedogodność. –

6

Można ustawić atrybuty dla elementów po stronie serwera.

<asp:HyperLink ID="HyperLink1" runat="server" Text="Click me" 
    href="#" style="color: red;" /> 

w kodzie opóźnieniem, jak również przy użyciu Attributes własność

HyperLink1.Attributes 
2

Faktycznie, dodając kontrolę do strony bez href/atrybut (y) NavigateUrl oferuje największą ELASTYCZNOŚCI.

<asp:HyperLink ID="HyperLink1" runat="server"/> 

Następnie przypisanie atrybutu href w kodzie tyłu wygląda odpowiedź Bruna:

HyperLink1.Attributes.Add("href","{your-value-here}"); 

chociaż, Bruno i Caspar męska odpowiedzi pracować łamią w pewnych kontekstach. Na przykład powiedz, że kontrola HyperLink jest zagnieżdżona w Repeaterie. Jeśli chcesz warunkowo ustawić atrybut href na rzeczywisty URL lub "#", te podejścia nie będą działać. "#" Będzie renderowane za każdym razem.

Powiązane problemy