gpt4 book ai didi

c# - 用户控件的工厂模式

转载 作者:太空宇宙 更新时间:2023-11-03 14:32:38 25 4
gpt4 key购买 nike

我创建了一个 ASP.NET 用户控件,并希望创建一个工厂,该工厂的方法允许通过多个参数创建控件。

最初我打算在用户控件上创建一个带有参数的构造函数,但提供这些参数实际上只是为了让一些遗留代码更容易创建用户控件,我不想进行重大更改。我决定改为在工厂类中使用遗留代码可以使用的方法,这样我就不会弄乱我的用户控件的界面。

我遇到的问题是我无法从工厂类引用用户控件类(因为通常您通过添加 <%@ Reference Control="~/SomeControl.ascx" %> 以编程方式引用用户控件,但工厂类不是 asp 页面)。

附带说明一下,我打算让调用页面传递对自身的引用,以便工厂方法可以调用 LoadControl,但我仍然需要能够声明 SomeControl 变量,但它不能。

如何为用户控件创建工厂?

最佳答案

声明式编程(用户控件就是为之设计的)不能很好地转化为命令式对象构造。为什么不创建一个适配器用户控件(或服务器控件),使遗留代码更容易使用 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" />

一些控件.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 更易于使用的形式。

关于c# - 用户控件的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2239426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com