我创建了一个ASP.NET用户控件,并且希望使用允许通过多个参数创建控件的方法创建工厂。
最初我打算在用户控件上有一个带有参数的构造函数,但实际上只提供了参数,以便从一些我不想显着改变的遗留代码中更容易地创建用户控件。我决定在工厂类中使用遗留代码可以使用的方法,这样我就不会混淆用户控件的界面。
我遇到的问题是我无法从工厂类引用用户控件类(因为通常通过添加<%@ Reference Control="~/SomeControl.ascx" %>
以编程方式引用用户控件,但工厂类不是asp页面。 / p>
在旁注中,我将调用页面传递对自身的引用,以便工厂方法可以调用LoadControl,但我仍然需要能够声明SomeControl变量,但它不能。
如何为用户控件创建工厂?
答案 0 :(得分:1)
声明性编程(为其设计了用户控件)不能很好地转换为命令式对象构造。为什么不创建一个适配器用户控件(或服务器控件),使旧版代码更容易使用SomeControl?如下所示。假设我们有一个遗留页面,它在SqlDateTime方面有很多逻辑,我们编写了一些新的控件,可以用普通的DateTime来完成它的工作。
LegacyPage.aspx:
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Register Src="~/SomeControlLegacyAdapter.ascx" TagName="SomeControlLegacyAdapter" TagPrefix="test" %>
<script type="text/C#" runat="server">
protected void Page_Load(object sender, EventArgs e)
{
SomeControlLegacyAdatper1.Time = new System.Data.SqlTypes.SqlDateTime(DateTime.Now);
}
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<test:SomeControlLegacyAdapter runat="server" ID="SomeControlLegacyAdatper1" />
</div>
</form>
</body>
</html>
SomeControlLegacyAdapter.ascx
<%@ Control Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Data.SqlTypes"%>
<%@ Register Src="~/SomeControl.ascx" TagPrefix="test" TagName="SomeControl" %>
<script type="text/C#" runat="server">
public SqlDateTime Time
{
get { return SomeControl1.Time; }
set { SomeControl1.Time = (DateTime)value; }
}
</script>
<test:SomeControl ID="SomeControl1" runat="server" />
SomeControl.aspx
<%@ Control Language="C#" AutoEventWireup="true" %>
<script type="text/C#" runat="server">
public DateTime Time
{
get { return string.IsNullOrEmpty(output.Text) ? DateTime.MinValue : DateTime.Parse(output.Text); }
set { output.Text = value.ToString(); }
}
</script>
<asp:Literal runat="server" id="output" />
旧版适配器将SomeControl转换为更易于LegacyPage使用的表单。