Заводская модель для пользовательских элементов управления - PullRequest
2 голосов
/ 10 февраля 2010

Я создал пользовательский элемент управления ASP.NET и хотел создать фабрику с методом, позволяющим создавать элемент управления с помощью нескольких параметров.

Первоначально я собирался создать конструктор пользовательского элемента управления с параметрами, но параметры на самом деле предназначены только для того, чтобы упростить создание пользовательского элемента управления из некоего устаревшего кода, который я не хочу существенно менять. Я решил, что вместо этого хотел бы иметь метод в фабричном классе, который мог бы использовать унаследованный код, чтобы я не запутал интерфейс моего пользовательского элемента управления.

Проблема в том, что я не могу ссылаться на класс пользовательского элемента управления из класса фабрики (поскольку обычно вы ссылаетесь на пользовательский элемент управления программно, добавляя <%@ Reference Control="~/SomeControl.ascx" %>, но класс фабрики не является страницей asp).

В дополнение к этому я хотел, чтобы вызывающая страница передавала ссылку на себя, чтобы фабричный метод мог вызывать LoadControl, но мне все еще нужно иметь возможность объявить переменную SomeControl, чего не может быть.

Как создать фабрику для пользовательского элемента управления?

1 Ответ

1 голос
/ 11 февраля 2010

Декларативное программирование (для которого разработаны пользовательские элементы управления) не очень хорошо подходит для создания императивных объектов. Почему бы не создать пользовательский элемент управления адаптера (или серверный элемент управления), который облегчает использование 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.

...