2010-10-19 5 views
8

Si paso la clase derivada testA un PlaceHolder que contiene una Hyperlink, con una dirección URL que comienza con una tilde , se resuelve correctamente. Sin embargo, cuando paso testB (idéntico, aparte de la que es heredera System.Web.UI.UserControl) el mismo PlaceHolder Se renders literalmente (no transformada/resolver el '~')URL no está siendo resuelto cuando en control de usuario (ASP.NET)

¿Alguna idea?

public class testA : System.Web.UI.Control 
{ 
    public System.Web.UI.WebControls.PlaceHolder plc { get; set; } 
    protected override void OnLoad(EventArgs e) 
    { 
     if (plc != null) 
      this.Controls.Add(plc); 
     base.OnLoad(e); 
    } 
} 


public class testB : System.Web.UI.UserControl 
{ 
    public System.Web.UI.WebControls.PlaceHolder plc { get; set; } 
    protected override void OnLoad(EventArgs e) 
    { 
     if (plc != null) 
      this.Controls.Add(plc); 
     base.OnLoad(e); 
    } 
} 

Este es ASP.NET

+0

hace las dos cosas han RUNAT-servidor? – leppie

+1

Sí, si no tuviera runat = server, entonces no funcionaría en System.Web.UI.Control – maxp

+0

Gracias, ahora veo la diferencia (doh para mí, pensé que eran lo mismo) – leppie

Respuesta

5

Cuando se hereda de System.Web.UI.UserControl y no asocia su control con un archivo ascx entonces su control de TemplateSourceVirtualDirectory no se establecerá, esto es requerido por el método ResolveClientUrl - si es nula o vaciar la URL será devuelto TAL CUAL .

para resolver su problema, acaba de establecer AppRelativeTemplateSourceDirectory:

public class testB : System.Web.UI.UserControl 
{ 
    public System.Web.UI.WebControls.PlaceHolder plc { get; set; } 
    protected override void OnLoad(EventArgs e) 
    { 
     if (plc != null) 
     { 
      this.AppRelativeTemplateSourceDirectory = 
        plc.AppRelativeTemplateSourceDirectory; 
      this.Controls.Add(plc); 
     } 
     base.OnLoad(e); 
    } 
} 
1

A UserControl se asocia normalmente a un archivo ascx que define su margen de beneficio. Dichos controles deben crearse instancias usando TemplateControl.LoadControl() antes de que se agreguen a la página, con el fin de realizar la actualización del evento.

sospecho que ese evento de puesta al día no tiene lugar ya no se llama a LoadControl(), por lo que el Hyperlink 's NavigateUrl nunca tiene la oportunidad de ser resuelto adecuadamente.

+0

Tenía curiosidad sobre si 'testB' funcionaría incluso cuando se instanciara usando' LoadControl (Type, object []) 'y no funciona. Lo cual no es demasiado sorprendente, ya que como usted señala, los UserControls están destinados a tener asociado .ascx y ya sea declarados en el marcado o cargados mediante LoadControl. –

Cuestiones relacionadas