2011-06-07 15 views
9

Asp.Net es tremendamente ingenioso e intenta resolver el NavigateUrl de un hipervínculo en relación con el control en el que se encuentra o relativo a la raíz de la aplicación si coloca ~/al inicio.¿Puedo especificar explícitamente NavigateUrl en un hipervínculo?

Pero tengo una situación en la que quiero establecer explícitamente la url en una ruta relativa y no quiero que me 'ayude' en absoluto.

La URL de navegación de hipervínculo y la propiedad href de HtmlAnchor muestran este comportamiento. ¿Es posible detener este comportamiento? ¿O tendré que generar el marcado a mano y no usar un control?

por ejemplo Tengo un control de usuario en la carpeta [appRoot]/foo/bar que contiene asp:Hyperlinks.
Uso el control en la página [appRoot]/myPage.aspx. Quiero que la propiedad href de los hipervínculos, cuando se represente, sea exactamente igual a 'donkey.gif'.

Pero si escribo la siguiente

<asp:Hyperlink runat="server" NavigateUrl="donkey.gif" /> 

entonces el href prestado será 'foo/bar/donkey.gif'.

Por razones complicadas que prefiero no entrar aquí, usar "~/donkey.gif" no es una opción. Además, no puedo usar ResolveUrl(string url) para generar direcciones URL absolutas.

+0

No tengo su pregunta con claridad, ¿puede indicarnos dónde intenta especificar el NavigateURL Explcitly? –

+0

¿Cómo espera 'NavigateUrl =" donkey.gif "' resolver alguna vez 'images/donkey.gif'? ¿De dónde provienen las imágenes? –

+0

@Dan Diplo - Mi error. La pregunta ha sido editada/corregida –

Respuesta

4

¿No puede simplemente usar un ancla HTML (sin el atributo runat="server")? Por ejemplo:

<a href="relative.htm">link text</a> 

actualización: si no quiere perder la funcionalidad del control de hipervínculo, se podría crear un control que deriva de HyperLink y reemplaza el método AddAttributesToRender() (aquí es donde el NavigateUrl se resuelve) .

HyperLink.AddAttributesToRender() se parece a esto:

de control
protected override void AddAttributesToRender(HtmlTextWriter writer) 
{ 
    ... 
    string navigateUrl = this.NavigateUrl; 
    if (navigateUrl.Length > 0 && base.IsEnabled) 
    { 
     string str = base.ResolveClientUrl(navigateUrl); 
     writer.AddAttribute(HtmlTextWriterAttribute.Href, str); 
    } 
    ... 
} 

de hipervínculo:

public class MyHyperLink : HyperLink 
{ 
    protected override void AddAttributesToRender(HtmlTextWriter writer) 
    { 
    if ((base.Enabled && !base.IsEnabled) && base.SupportsDisabledAttribute) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled"); 
    } 
    base.AddAttributesToRender(writer); 
    if (this.NavigateUrl.Length > 0 && base.IsEnabled) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Href, this.NavigateUrl); 
    } 
    if (this.Target.Length > 0) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Target, this.Target); 
    } 
    } 
} 
+0

Parece que esta es la forma en que tengo que ir. Es frustrante porque establecí algunas propiedades (como Target, Tooltip, etc.) en el código, lo que hace que generar el marcado general sea oneroso. –

12

Una solución más sencilla sería la de establecer el atributo href del asp: hipervínculo en lugar de utilizar la propiedad NavigateUrl:

hyperlink1.Attributes("href") = "exactpath.gif" 

hyperlink1.Attributes("href") = ResolveUrl("~/dir/page.aspx") 

A partir de .NET4 también puede establecer el atributo href e directamente así:

<asp:Hyperlink runat="server" href="donkey.gif" /> 
+2

+1. ¡Realmente amo cuando algo tan simple resuelve el problema! –

+0

Gracias. Solo establecer 'href' en el marcado también funciona. – Corgalore

+0

Gracias por esto: estaba configurando la propiedad NavigateUrl en mi código subyacente y no funcionaba. Establecer el atributo href trabajado. – RoastBeast

Cuestiones relacionadas