2010-02-10 6 views
2

J'ai créé un contrôle utilisateur ASP.NET et souhaitait créer une fabrique avec une méthode permettant de créer un contrôle via plusieurs paramètres. A l'origine j'allais avoir un constructeur sur le contrôle utilisateur avec les paramètres, mais les paramètres ne sont vraiment fournis que pour faciliter la création du contrôle utilisateur à partir de quelque code hérité que je ne veux pas changer de manière significative. J'ai décidé que je voulais plutôt avoir une méthode dans une classe d'usine que le code hérité pourrait utiliser, de cette façon, je ne boue pas l'interface de mon contrôle utilisateur. Le problème que j'ai est je ne peux pas référencer la classe de contrôle d'utilisateur de la classe de fabrique (puisque normalement vous référencez un contrôle d'utilisateur par programmation en ajoutant <%@ Reference Control="~/SomeControl.ascx" %> mais la classe de fabrique n'est pas une page d'asp). Sur une note de côté, j'allais faire en sorte que la page appelante passe une référence à elle-même pour que la méthode usine appelle LoadControl, mais je dois toujours pouvoir déclarer une variable SomeControl, ce qu'elle ne peut pas faire.Modèle d'usine pour les contrôles utilisateur

Comment créer une fabrique pour un contrôle utilisateur?

+1

La méthode d'usine peut prendre la page en paramètre, et l'usine devrait pouvoir utiliser loadcontrol pour créer une instance du contrôle utilisateur, puis il devrait pouvoir ajouter le contrôle à la collection de contrôles de la page, et l'usine La méthode peut également renvoyer une référence à l'instance de contrôle utilisateur nouvellement créée afin que la page appelante l'ait pour une utilisation ultérieure. Vous semblez avoir parlé de toutes ces choses, alors je ne sais pas exactement quelle partie du problème vous fait trébucher? Pouvez-vous inclure plus de détails, ou peut-être du code? –

+1

Je crois qu'il développe un site Web (pas de projet Web App). La méthode factory ne peut pas utiliser la classe SomeControl en raison de la manière dont le code du site Web est compilé et référencé. Le code de modèle est compilé (éventuellement à la première demande) séparé de App_Code. L'assemblage du modèle dépend de l'assemblage App_Code, et non l'inverse. –

+0

gWiz a raison. Je ne peux même pas déclarer une variable SomeControl sans une erreur de compilation car elle n'est pas reconnue. J'essaye de créer de nombreuses instances de SomeControl par programme, plutôt que de manière déclarative, en raison de la nature dynamique du formulaire. – AaronLS

Répondre

1

La programmation déclarative (pour laquelle les contrôles utilisateur sont conçus) ne se traduit pas bien dans la construction d'un objet impératif. Pourquoi ne pas créer un adaptateur User Control (ou un contrôle serveur) qui rend SomeControl plus facile à utiliser par le code existant? Comme le suivant. Disons que nous avons une page héritée qui a beaucoup de logique en termes de SqlDateTime, et nous écrivons un nouveau contrôle qui fait son travail en termes de DateTime plaine.

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" /> 

L'adaptateur convertit héritage SomeControl en une forme plus facile pour LegacyPage de consommer.

Questions connexes