2013-07-25 22 views
0

我有一個自定義WebControl類,表示由li(列表項)元素包圍的HyperLink。我希望能夠加載此控件並以編程方式將其添加到頁面中。使用LoadControl以編程方式加載WebControl(不是UserControl)

這裏是定製的Web控件(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

只需實例化您的自定義控件並將其添加到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

這似乎工作!我想我是過度思考的東西......我習慣於爲UserControl調用'LoadControl()',當它不適用於WebControls時,我感到沮喪。謝謝! –

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。我只是說;我希望你不介意。

+0

RE:Page_Load vs. OnLoad - 我更喜歡重寫基本方法,而不是使用「AutoEventWireup」約定,因爲它看起來更清晰。 [本文](http://weblogs.asp.net/infinitiesloop/archive/2008/03/24/onload-vs-page-load-vs-load-event.aspx)涉及許多我喜歡的原因這種方法。唯一真正的缺點是你必須記住始終調用該方法的基本版本。雖然我感謝你的關注! :) –

+0

我幾年前也讀過那篇文章。除了在舊的DNN中,我通常不會在大多數開源項目中看到這種覆蓋。但是,這完全取決於你。 – Win

相關問題