2010-10-19 14 views
8

Wenn ich die abgeleitete Klasse testA ein PlaceHolder geben, die ein Hyperlink, mit einer URL enthält, die mit einer Tilde beginnt, löst er es richtig. Wenn ich jedoch passieren testB (identisch abgesehen davon aus System.Web.UI.UserControl erbt) die gleiche PlaceHolder Es es macht buchstäblich (nicht verwandeln/lösen die ‚~‘)URL ist nicht gelöst werden, wenn in Usercontrol (ASP.NET)

Irgendwelche Ideen?

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); 
    } 
} 

Dies ist ASP.NET

+0

hat sowohl runat-Server? – leppie

+1

Ja, wenn es nicht runat = server hätte, dann würde es nicht funktionieren in System.Web.UI.Control – maxp

+0

Danke, jetzt sehe ich den Unterschied (doh zu mir, dachte, sie waren gleich) – leppie

Antwort

5

Wenn Sie von System.Web.UI.UserControl erben und nicht assoziieren Ihre Steuerung mit einer ascx Datei dann Steuer TemplateSourceVirtualDirectory wird nicht gesetzt, wird dies durch die ResolveClientUrl Verfahren erforderlich ist - wenn sein null oder leer wird die URL zurückgegeben werden, wie IS .

Ihr Problem zu lösen, setzen nur 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 normalerweise mit einer Datei, die ascx seine Markup definiert zugeordnet ist. Solche Steuerelemente sollten unter Verwendung von TemplateControl.LoadControl() instanziiert werden, bevor sie der Seite hinzugefügt werden, um eine Ereignisaufholung durchzuführen.

Ich vermute, dass Ereignis aufholen nicht stattfindet, da Sie LoadControl() nicht aufrufen, so dass die HyperlinkNavigateUrl nie eine Chance, ordnungsgemäß gelöst werden.

+0

Ich war neugierig, ob 'testB' funktionieren würde, selbst wenn es mit' LoadControl (Type, object []) instanziiert wurde, und das tut es nicht. Das ist nicht zu überraschend, da UserControls, wie Sie darauf hinweisen, assoziierte .ascx haben und entweder im Markup deklariert oder mit LoadControl geladen werden. –

Verwandte Themen