您可以将 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" />
...这将从您的自定义库中加载您的 Web 控件。