您可以將您的SpiffyControl到庫中 - 這會給它一個更精確的命名空間,並允許您在其他項目中使用它。但是,這有點複雜 - 您已經創建了一個UserControl,但它不會在庫中工作。 UserControls使用代碼隱藏模型 - 它們由兩個文件組成,一個標記和一個代碼。庫似乎不支持代碼隱藏模型,所以你不能使用UserControl。您需要將該用戶控件轉換爲Web控件。
創建一個新的類庫項目。打開項目的屬性並將AssemblyName和Default Namespace設置爲SpiffyLibrary。
現在我們需要轉換你的UserControl。首先,在你的新庫中創建一個類。將它稱爲SpiffyControl,就像您現有的用戶控件一樣,但是使它從System.Web.UI.WebControls.CompositeControl繼承。
其次,打開您現有用戶控件的代碼並複製班級內的所有內容。然後回到新課堂並將其粘貼在裏面。如果您使用任何標準控制事件,則可能需要重命名這些功能以覆蓋適當的事件。例如,
protected void Page_Load(object sender, EventArgs e)
{
...
}
...應該成爲...
protected override void OnLoad(EventArgs e)
{
...
base.OnLoad(e);
}
三(這是複雜的部分),你需要複製你在SpiffyControl的標記文件有標記。您不能複製它 - 相反,您需要重寫從CompositeControl繼承的CreateChildControls()函數。標記中的每個標記都需要像變量一樣實例化並添加到類的Controls集合中。因此,舉例來說,如果你現有的標記文件是這樣的:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SpiffyControl.ascx.cs" Inherits="Controls_SpiffyControl" %>
<div id="Div1" runat="server">
<asp:Label ID="TextOutput" runat="server" />
</div>
...那麼你的新的CreateChildControls功能應該是這樣的:
HtmlGenericControl Div1;
Label TextLabel;
protected override void CreateChildControls()
{
Div1 = new HtmlGenericControl("div");
this.Controls.Add(Div1);
TextLabel = new Label();
Div1.Controls.Add(TextLabel);
base.CreateChildControls();
}
注意,控件聲明爲類領域;這樣,它們對所有類方法都是可見的。
一旦您轉換了標記,編譯庫項目並將其添加到您的網站項目的引用。然後打開你的網站的web.config文件並找到system.web/pages/controls部分。這部分應該已經有這樣的標籤:
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
該標籤是什麼讓你使用ASP核心庫的控件。因此,我們要添加一個只是喜歡它,我們的圖書館:
<add tagPrefix="spiffy" namespace="SpiffyLibrary" assembly="SpiffyLibrary" />
現在,在您的網站的任何地方,你可以把類似這樣的標記:
<spiffy:SpiffyControl ID="SpiffyInstance" runat="server" />
...,這將從您的自定義庫加載您的網頁控制。
您可以使用LoadControl,但施放它。 SpiffyControl spiffy =(SpiffyControl)LoadControl(「usercontrol.ascs」); – Geoff 2009-05-21 19:47:00
問題是我不能訪問SpiffyControl類型,所以我也不能施放它 - 如果我可以施放它,我也可以簡單地實例化它。 – 2009-05-21 20:13:02
爲什麼你不能訪問SpiffyControl類型? – Jonas 2009-06-05 16:54:33