2010-10-19 2 views
8

Если я прохожу производный класс testAPlaceHolder, который содержит Hyperlink, с URL, который начинается с тильда, он решает проблему правильно. Однако, когда я прохожу testB (идентичны за исключением наследует от System.Web.UI.UserControl) тот же PlaceHolder Это делает его буквально (не преобразования/разрешить «~»)URL не разрешаются, когда в UserControl (ASP.NET)

Есть идеи?

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

Это ASP.NET

+0

ли оба RUNAT-сервер? – leppie

+1

Да, если у него не было runat = server, тогда он не работал бы в System.Web.UI.Control – maxp

+0

Спасибо, теперь я вижу разницу (doh для меня, думал, что они такие же) – leppie

ответ

5

Когда вы унаследовали от System.Web.UI.UserControl и не связываете свой контроль с ascx файлом, то ваш контроль TemplateSourceVirtualDirectory не будет установлен, это требуется по методу ResolveClientUrl - если его нулевой или пустая URL-адрес будет возвращен AS IS ,

Чтобы решить проблему, просто установите 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

UserControl обычно ассоциируется с ascx файл, который определяет его разметку. Такие элементы управления должны быть созданы с использованием TemplateControl.LoadControl(), прежде чем они будут добавлены на страницу, чтобы выполнить догоняющее событие.

Я подозреваю, что догоняющее событие не происходит, так как вы не вызываете LoadControl(), поэтому HyperlinkNavigateUrl никогда не получит шанс на правильное разрешение.

+0

Мне было любопытно, будет ли 'testB' работать даже при создании экземпляра с использованием' LoadControl (Type, object []) ', и это не так. Это не слишком удивительно, поскольку, как вы отмечаете, UserControls должны иметь связанный .ascx и либо быть объявлены в разметке, либо загружены с помощью LoadControl. –

Смежные вопросы