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

时间:2013-07-25 19:59:05

标签: c# asp.net dynamic webforms custom-controls

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

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

public class ListItemHyperLink : HyperLink
{
    public string ListItemCssClass { get; set; }

    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        if (!String.IsNullOrWhiteSpace(ListItemCssClass))
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Class, ListItemCssClass);
        }
        writer.RenderBeginTag("li");
        base.RenderBeginTag(writer);
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        base.RenderEndTag(writer);
        writer.RenderEndTag();
    }
}

以下是我尝试将其添加到(Test.aspx)的页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Example.Test" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>My Page</title>
</head>
<body>
    <form id="Form1" runat="server">
        <ul runat="server" ID="UnorderedList">
        </ul>
    </form>
</body>
</html>

这是我尝试在页面的代码隐藏中动态加载控件(Test.aspx.cs):

public partial class Test : Page
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        var listItemHyperLink = (ListItemHyperLink) LoadControl("~/Controls/ListItemHyperLink.cs");
        listItemHyperLink.Text = "Google";
        listItemHyperLink.NavigateUrl = "http://google.com/";
        listItemHyperLink.ListItemCssClass = "li-class";
        listItemHyperLink.CssClass = "a-class";
        UnorderedList.Controls.Add(listItemHyperLink);
    }
}

当我尝试这个时,我得到以下例外:

  

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

在我调用LoadControl()的行上抛出此异常。

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

2 个答案:

答案 0 :(得分:2)

只需修改自定义控件并将其添加到Controls集合中即可。 LoadControl用于UserControls。

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

答案 1 :(得分:1)

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

使用覆盖方法看到PageLoad有点奇怪。除非你背后有理由否则这是不正常的。这就像使用Int32而不是int。我只是说;我希望你不介意。