2009-09-28 11 views
20

Come si ottiene un controllo HTMLAnchor per avere href = "#". Continua a risolvere il "#" sul percorso di controllo.asp.net user control, ottenendo htmlAnchor resolve to href = "#"

<a href="#" runat="server" /> 
resolves to: <a href="../ControlPath/#"> 

io non riesco a ottenere una ricerca su google per darmi i risultati che voglio così ho pensato di chiedere qui.

MODIFICA: Sintassi.

La rimozione del server runat non è un'opzione. È manipolato nel back-end, questa era solo una semplificazione.

+1

Non dovrebbe essere intitolato "semplice domanda Asp.Net"? –

+5

No, dovrebbe essere intitolato qualcosa come "Come posso creare un ancoraggio HTML con href = '#'?" "semplice domanda Asp.Net" è più corretta, ma altrettanto inutile in una ricerca. – Beska

+0

cambiato titolo come da richiesta/punto. – Highstead

risposta

26

Ho avuto lo stesso problema, ecco come avrei potuto risolverlo:

Codice originale

controllo dell'utente:

<a id="foo" runat="server">...</a> 

codice dietro:

foo.Attributes.Add("href", "#"); 

uscita :

<a id="..." href="../Shared/Controls/#">...</a> 

Aggiornato controllo utente codice

:

<asp:HyperLink id="foo" runat="server">...</asp:HyperLink> 

codice dietro:

foo.Attributes.Add("href", "#"); 

uscita:

<a id="..." href="#">...</a> 
+0

Grazie, è stato molto utile. Questo problema mi stava facendo impazzire –

+0

Questa è una soluzione molto preferibile a quelle sopra, ma è un bel modo in fondo alla pagina! – Karl

0

Provare a rimuovere l'attributo "runat" e racchiudere ciò che si desidera collegare;

<a href="#" >Your Link Text/Image Here</a> 
+0

La rimozione di runat = "server" non è un'opzione in quanto altri attributi vengono modificati nel back-end. Questa era solo una semplificazione. – Highstead

0

Questo dovrebbe funzionare.

<a href="javascript:void(0)">text</a> 

Questo dovrebbe funzionare.

<a href="~/#">text</a> 
+0

Per essere chiari, questa risposta * non * fornirà ciò che è richiesto specificamente ... (il carattere '#'), ma potrebbe essere abbastanza buono se tutto ciò che l'OP deve fare è avere un collegamento che "non fa nulla. " – Beska

+0

L'esempio era tale da semplificare il problema. Sto solo sintatticamente cercando di seguire l'href = "#". Il tag di ancoraggio ha pochi altri attributi. – Highstead

9

Ho avuto un problema simile quando il rendering della pagina con PageParser.GetCompiledPageInstance() o quando l'URL è stato riscritto. Per qualche motivo l'HtmlAnchor è sempre stato risolto in modo errato (simile a quello che hai sopra).

Terminato usando solo un HtmlGenericControl, poiché lo stai manipolando sul lato server, questa potrebbe essere una possibilità per te.

HtmlGenericControl anchor = new HtmlGenericControl("a"); 
anchor.Attributes.Add("href", "#"); 
+0

La riscrittura dell'URL è causata dal metodo ResolveURL sulla classe Control. L'ho guardato in Reflector e ho scoperto che tenterà di riscrivere tutto ciò che pensa sia un URL relativo se AppRelativeTemplateSourceDirectory non è vuoto. La semplice soluzione è impostare questa variabile sull'oggetto Page su una stringa vuota a un livello globale (o almeno prima di Render). Suppongo che una vera soluzione sarebbe quella di ottenere microsoft per rendere UrlPath.IsRelativeUrl() più intelligente. – Sorpigal

+1

La soluzione di Ramses è molto più pulita perché esiste un controllo specifico per i collegamenti in asp.net. Perché usare uno generico? –

+0

@Sorpigal, la tua soluzione è di gran lunga la migliore. Non ho bisogno che qualcun altro traduca tutti i percorsi relativi a ciò che ritengono sia corretto per me. So esattamente dove sono i miei file. Suggerisco di pubblicare la tua soluzione come risposta per ottenere più pubblicità. – AaA

0

EDIT: include percorsi nidificati

Il mio progetto di test rende il link corretto per me:

http://localhost:2279/WebSite1/Default.aspx# 

ASPX:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Register src="control/WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server">  
      <uc1:WebUserControl2 ID="WebUserControl21" runat="server" /> 
    </form> 
</body> 
</html> 

controllo:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl2.ascx.cs" Inherits="WebUserControl2" %> 
<a id="A1" href="<%# URLHelper("~/#") %>" runat="server" >here</a> 

controllo codice sottostante:

protected string URLHelper(string s) 
{ 
    return Control.ResolveUrl(s); 
} 
+0

Control è in percorso progetto/UserControls/myControl.ascx pagina è in percorso progetto/CRUD/Page.aspx E 'stato in un ripetitore ma la funzionalità è la stessa di fuori del ripetitore – Highstead

+0

Crap, dimenticò il percorso nidificato , Lo metterò alla prova. –

0

Anche il mio funziona bene ... Ho un AnchorTag.ascx controllo dell'utente:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AnchorTag.ascx.cs" Inherits="JavascriptScroll.AnchorTag" %> 
<a id="A1" href="#" runat="server" >Anchor Tag</a> 

E ho incluso come:

<%@ Register src="AnchorTag.ascx" tagname="AnchorTag" tagprefix="uc1" %> 

. . .

<uc1:AnchorTag ID="AnchorTag1" runat="server" /> 

. .

E rende come previsto:

<a href="#" id="AnchorTag1_A1">Anchor Tag</a> 

Si prega di correggermi se sto facendo qualcosa che non è previsto ...

+1

Il controllo si trova in una cartella separata. In particolare progetto/UserControls/myControl.ascx. La pagina si trova nella cartella project/Crud/MyPage.aspx. Sono in grado di duplicare questa funzionalità ogni volta. – Highstead

2

Brendan Kowitz soluzione funziona, ma non ero in grado di implementare a causa del modo in cui questo controllo deve funzionare. Ho finito per dover incidere secondo il seguente codice nel codice dietro:

lnk.Attributes.Add("href",Page.Request.Url.ToString() + "#"); 

Dove LNK è un HtmlAnchor.

Il motivo di questo problema, in primo luogo, è che il controllo non si trova nella stessa directory della pagina e .Net si occupa di risolvere "intelligentemente" il problema per te. Quanto sopra funzionerà, anche se se qualcuno ha una soluzione migliore sono tutto orecchie.

0

Che dire di questo?

HtmlAnchor errorLink = new HtmlAnchor(); 
errorLink.InnerText = this.Message; 
errorLink.HRef = errorLink.ResolveClientUrl("#" + this.FormControlId); 
errorLink.Attributes["rel"] = "form_help"; 

Funziona per me ma sto utilizzando un controllo server in una libreria di classi anziché un controllo utente. Penso che dovrebbe funzionare anche per un controllo utente.

1

Mi sono imbattuto nella stessa cosa. Se si imposta questo al caricamento della pagina, funzionerà:

AppRelativeTemplateSourceDirectory = ""; 
2

Inizialmente ho avuto questo come un commento, ma su richiesta sto aggiungendo come una risposta dal momento che nessuno altro ha spiegato il motivo per cui il comportamento originale si sta verificando o come per prevenirlo direttamente.

La riscrittura dell'URL è causata dal metodo ResolveURL nella classe Control. L'ho guardato in Reflector e ho scoperto che tenterà di riscrivere tutto ciò che pensa sia un URL relativo se AppRelativeTemplateSourceDirectory non è vuoto.

La soluzione semplice consiste nell'impostare questa variabile sull'oggetto Page su una stringa vuota a un livello globale (o almeno prima di Render), anche se questo potrebbe essere un problema se qualche altro bit della struttura di controllo lo richiede vuoto.

Suppongo che una vera soluzione sarebbe ottenere Microsoft per rendere UrlPath.IsRelativeUrl() più intelligente.

Problemi correlati