C# 使用LoadControl以编程方式加载WebControl(而不是UserControl)

C# 使用LoadControl以编程方式加载WebControl(而不是UserControl),c#,asp.net,dynamic,webforms,custom-controls,C#,Asp.net,Dynamic,Webforms,Custom Controls,我有一个自定义的WebControl类,它表示由li(列表项)元素包围的HyperLink。我希望能够加载此控件并以编程方式将其添加到页面 以下是自定义web控件(ListItemHyperLink.cs): 这是我试图将其添加到的页面(Test.aspx): 当我尝试此操作时,会出现以下异常: 无法将类型为“System.Web.Compilation.BuildResultCompiledAssembly”的对象强制转换为类型为“System.Web.Util.IWebObject Fact

我有一个自定义的
WebControl
类,它表示由
li
(列表项)元素包围的
HyperLink
。我希望能够加载此控件并以编程方式将其添加到页面

以下是自定义web控件(
ListItemHyperLink.cs
):

这是我试图将其添加到的页面(
Test.aspx
):

当我尝试此操作时,会出现以下异常:

无法将类型为“System.Web.Compilation.BuildResultCompiledAssembly”的对象强制转换为类型为“System.Web.Util.IWebObject Factory”

在调用
LoadControl()
的行中引发此异常


如何使用
LoadControl()
(或其他方法)从代码中使用此控件?

只需重新设置自定义控件并将其添加到控件集合。LoadControl用于用户控件

var listItemHyperLink = new ListItemHyperLink();
listItemHyperLink.Text = "Google";
listItemHyperLink.NavigateUrl = "http://google.com/";
listItemHyperLink.ListItemCssClass = "li-class";
listItemHyperLink.CssClass = "a-class";
UnorderedList.Controls.Add(listItemHyperLink);

只需设置自定义控件并将其添加到控件集合中。LoadControl用于用户控件

var listItemHyperLink = new ListItemHyperLink();
listItemHyperLink.Text = "Google";
listItemHyperLink.NavigateUrl = "http://google.com/";
listItemHyperLink.ListItemCssClass = "li-class";
listItemHyperLink.CssClass = "a-class";
UnorderedList.Controls.Add(listItemHyperLink);

ListItemHyperLink
是一个服务器控件,因此不能像用户控件那样加载它

protected void Page_Load(object sender, EventArgs e)
{
    var listItemHyperLink = new ListItemHyperLink();
    listItemHyperLink.Text = "Google";
    listItemHyperLink.NavigateUrl = "http://google.com/";
    listItemHyperLink.ListItemCssClass = "li-class";
    listItemHyperLink.CssClass = "a-class";
    UnorderedList.Controls.Add(listItemHyperLink);
}

看到使用覆盖方法加载页面有点奇怪。除非你有理由,否则这是不正常的。这就像使用Int32而不是int;我希望您不要介意。

ListItemHyperLink
是一个服务器控件,因此您不能像用户控件那样加载它

protected void Page_Load(object sender, EventArgs e)
{
    var listItemHyperLink = new ListItemHyperLink();
    listItemHyperLink.Text = "Google";
    listItemHyperLink.NavigateUrl = "http://google.com/";
    listItemHyperLink.ListItemCssClass = "li-class";
    listItemHyperLink.CssClass = "a-class";
    UnorderedList.Controls.Add(listItemHyperLink);
}

看到使用覆盖方法加载页面有点奇怪。除非你有理由,否则这是不正常的。这就像使用Int32而不是int;希望你不介意。

这似乎有效!我想我是想得太多了。。。我习惯于为UserControls调用
LoadControl()
,当它不适用于WebControl时,我感到很沮丧。谢谢这似乎有效!我想我是想得太多了。。。我习惯于为UserControls调用
LoadControl()
,当它不适用于WebControl时,我感到很沮丧。谢谢RE:Page_Load vs.OnLoad-我更喜欢重写基本方法,而不是使用
AutoEventWireup
约定,因为它看起来更干净。涉及到我喜欢这种方法的许多原因。唯一真正的缺点是您必须记住始终在中调用方法的
base
版本。不过我很感激你的关心!:)几年前我也读过那篇文章。除了在旧的DNN中,我通常不会在大多数开源项目中看到这种覆盖。但是,这完全取决于您。RE:Page_Load vs.OnLoad-我更喜欢重写基本方法,而不是使用
AutoEventWireup
约定,因为它看起来更干净。涉及到我喜欢这种方法的许多原因。唯一真正的缺点是您必须记住始终在中调用方法的
base
版本。不过我很感激你的关心!:)几年前我也读过那篇文章。除了在旧的DNN中,我通常不会在大多数开源项目中看到这种覆盖。然而,这完全取决于你。
protected void Page_Load(object sender, EventArgs e)
{
    var listItemHyperLink = new ListItemHyperLink();
    listItemHyperLink.Text = "Google";
    listItemHyperLink.NavigateUrl = "http://google.com/";
    listItemHyperLink.ListItemCssClass = "li-class";
    listItemHyperLink.CssClass = "a-class";
    UnorderedList.Controls.Add(listItemHyperLink);
}