8

如果我传递包含 a 的派生类testAa ,其 url 以波浪号开头,它会正确解析它。但是,当我通过 (除了它继承自 )相同的它时,它会按字面意思呈现它(不转换/解析'〜')PlaceHolderHyperlinktestBSystem.Web.UI.UserControlPlaceHolder

有任何想法吗?

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

4

2 回答 2

5

当您从文件继承System.Web.UI.UserControl并且不将您的控件与ascx文件关联时,TemplateSourceVirtualDirectory将不会设置您的控件,这是该ResolveClientUrl方法所要求的 - 如果其为 null 或为空,则 url 将按原样返回。

要解决您的问题,只需设置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);
    }
}
于 2010-11-01T10:21:28.373 回答
1

UserControl通常与ascx定义其标记的文件相关联。此类控件应在添加到页面之前使用TemplateControl.LoadControl()进行实例化,以便执行事件追赶。

我怀疑事件追赶不会发生,因为你不打电话LoadControl(),所以Hyperlink'NavigateUrl永远没有机会得到妥善解决。

于 2010-10-19T15:22:59.533 回答