prowlx
Messages postés4Date d'inscriptionjeudi 5 août 2004StatutMembreDernière intervention21 juillet 2006
-
19 juil. 2006 à 17:22
prowlx
Messages postés4Date d'inscriptionjeudi 5 août 2004StatutMembreDernière intervention21 juillet 2006
-
21 juil. 2006 à 16:07
Voici mon problème:
J'ai créé une page ASP par défaut avec le Web Development kit Express 2005 de MS
(donc utilise le framework .Net 2.0).
Cette page s'appele Default.aspx et le code C# qui lui est associé est Default.aspx.cs.
Cette page communique très bien avec les namespaces contenant d'autres classes C#.
Elle peut appeler les méthodes sur les pages C# par exemple : facadeUI.login(); Cela
fonctionne très bien.
Par contre, je me suis créé une fonction public dans la page web Default.aspx.cs soit
setNickName(string strNickName). J'aimerais pouvoir appeler cette méthode à partir des
classes C#. Je n'y arrive pas.
Comme vous pourrez le constater dans le code de Default.aspx.cs, j'envoie ma page courrante
à ma classe C# (FacadeUI facadeUI = new FacadeUI(this)). Dans ma classe facadeUI, je ne sais
pas quel type de classe lui donner pour pouvoir accéder aux méthodes publiques de ma page web.
On dirait qu'il n'y pas de namespace pour le using afin d'obtenir le type de "classe" de la
page web.
Voici le code du constructeur de ma classe C# facadeUI.
public FacadeUI(Page frmlogin)
{
this.frmlogin = frmlogin;
// J'aimerais pouvoir faire : frmlogin.setNickName("Toto");
// mais ne trouve pas la méthode puisque c'est du type Page...
}
J'ai mis comme type de classe Page. Bien sûr il faudrait qu'il y ait un type _Default ou
ASP.DefaultPage... ou quelque chose comme ça afin que je puisse accéder à
setNickName(string strNickName).
Donc mon problèm :
ASP vers C# fonctionne très bien (capable d'appeler facadeUI.login())
C# vers ASP ne fonctionne pas (pas capable d'appeler setNickName("Toto"))
Voici le code de Default.aspx.cs :
__________________________________________________________________________________
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//Namespace pour les classes C#
using Client.Controler;
using Client.Model;
using Client.View;
using Client.PatternObserver;
using Client.Remote;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
FacadeModel facadeModel = new FacadeModel();
FacadeUI facadeUI = new FacadeUI(this); //On lui donne la page courrante
facadeUI.login();
}
public void setNickName(string strNickName)
{
this.TextBox1.Text = strNickName; //TextBox1 est protected...
}
}
__________________________________________________________________________________
Merci,
Prowlx
A voir également:
Le protocole assure que la communication entre l'ordinateur de pascal
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 19 juil. 2006 à 23:46
Tu ne peux pas faire ca, car tu ne connais pas encore le type de ta page, il est définit pendant la compilation :s ce que tu peux faire par contre c'est faire implementé ta classe d'une interface que tu définis et comme ca tu peut spécifier les méthodes qu'a ta page :-)
Mais je ne comprend vraiment pas ce que tu veux faire, la couche logique n'a pas a accedé à la couche présentation ! seulement l'inverse :S
prowlx
Messages postés4Date d'inscriptionjeudi 5 août 2004StatutMembreDernière intervention21 juillet 2006 21 juil. 2006 à 16:07
Salut Cyril,
Merci pour tes conseils puisque l'implémentation d'une interface fonctionne très bien!
Le seul point faible est que chaque page ASP qui contient des méthodes publiques qui doivent être appelées par le déclenchement d'une mise à jour du Modèle, doit implémenter une interface... Donc si j'ai 5 pages ASP, il faut que j'aie 5 interfaces, mais c'est la seule façon. Je trouve ça platte que je ne puisse pas lui passer le type de classe par exemple : Default (du fichier Default.aspx.cs), mais au moins lorsque je lui fais implémenter l'interface : ILoginUI (contenant une définition d'une méthode : void setNickName(string strNickName)) je peux l'appeler dans une autre classe C# de cette façon :
private ILoginUI frmlogin;
public FacadeUI(ILoginUI frmlogin) //constructeur d'une autre classe C# soit du patron Façade
{
this.frmlogin = frmlogin;
frmlogin.setNickName("Toto");
}
Afin de découpler le Modèle des Vues, j'ai utilisé le patron Facade. Donc j'ai une classe FacadeModele et une classe FacadeUI (comme l'exemple) qui ne fait que rediriger les appels de méthodes aux bonnes classes. Donc les Vues ne connaissent pas toutes les classes formant le modèle mais seulement sa façade.
Pour ce qui est du gestionnaire d'événements, je trouve sincérement que le gestionnaire d'événements ressemble beaucoup au patron Observer. Mon modèle (FacadeModele) est un Observable (public class FacadeModel : Observable) :
namespace Client.PatternObserver
{
public class Observable
{
ArrayList listObservers = new ArrayList();
public void addObserver(IObserver observer)
{
listObservers.Add(observer);
}
public void removeObserver(IObserver observer)
{
listObservers.Remove(observer);
}
public void notify(Object args)
{
notify(args, null);
}
public void notify(Object args, Object myObject)
{
foreach (IObserver observer in listObservers)
{
observer.update(this, args, myObject);
}
}
}
}
Il contient une liste de tous les Observeurs (qui est un listener les événements). Lorsque j'appele une méthode (qui est un événement) de mon modèle qui doit faire une modification des Vues, j'appele notify(...). Le notify va appeler la méthode update (mis à jour) de tous les Observeurs qui lui sont associés.
C'est dans cet Observeur que je fais la gestion des événements reçu. La méthode update peut alors rediriger les mises à jour vers la FacadeUI (qui elle la retransmet vers les pages ASP) selon les paramètres reçus.
Donc on peut dire que le gestionnaire d'événements fonctionne sensiblement de la même façon que le patron Observer.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 19 juil. 2006 à 22:48
Bonsoir,
Je pense que tu devrais d'avantages te documenter sur la notion d'objet en .net :-)
Pour résoudre ton problème il suffit de créer un nouveau fichier de classe (que l'on met dans le dossier app_code) dans cette classe tu met les propriétés et méthodes que tu veux (static ou non) tu peux ensuite appeller ces méthodes dans toutes les pages que tu veux ...
prowlx
Messages postés4Date d'inscriptionjeudi 5 août 2004StatutMembreDernière intervention21 juillet 2006 19 juil. 2006 à 23:33
Comme je l'ai spécifié, je suis capable d'accéder à mes méthodes C# des classes qui se situe dans app_code (ex: facadeUI.login()) à partir de la page web (Default.aspx.cs). Le problème n'est pas là. C'est de l'autre sens que je n'arrive pas à appeler des méthodes de ma classe reliée à ma page web(Default.aspx.cs) à partir d'une classe C# qui se trouve dans app_code.
Pour être plus clair :
Voici un bout de code C# qui se trouve dans app_code :
public FacadeUI(Page frmlogin)
{
this.frmlogin = frmlogin;
}
Dans ce constructeur, je ne peux pas appeler la méthode frmlogin.setNickName("Toto") puisque frmlogin (qui est passé en paramètre) est de type Page qui est défini par .Net et non pas un type défini par moi (comme le nom d'une classe C#)... Je n'arrive pas à trouver le type qui devrait être, selon moi, ASP.Default ou quelque chose comme ça.
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
prowlx
Messages postés4Date d'inscriptionjeudi 5 août 2004StatutMembreDernière intervention21 juillet 2006 20 juil. 2006 à 14:06
Salut Cyril,
Je vais essayer en implémentant une interface. Je t'en redonnerai des nouvelles.
Je suis d'accord avec toi que la couche présentation ne devrait pas être accéder directement par la couche logique, mais parfois le Modèle doit mettre à jour (update) les Vues qui lui sont associées de façon indirecte (par le pattron Observateur-Observé ou par le Contrôleur du pattron MVC).
Par exemple, mon application est multi-client (de type clients-serveur) pour une application de bavardage. Lorsqu'un client change sont état (ex: Occupé) -> le serveur se met à jour. Le serveur doit alors aviser (notifier) tous les clients qui sont associés au contact qui vient d'être modifié. C'est ainsi qu'un nouveau thread est lancé sur les clients pour mettre à jour leur Modèle. Lorsque le modèle est mis à jour, il doit bien sûr en aviser les Vues (GUI par l'Observateur : méthode update) qui lui sont associé pour changer l'état du client qui vient d'être modifié.
C'est pour ça que les Vues doivent être indirectement mises à jour lors d'une modification du Modèle!
Une autre réponse d'un autre forum pour ma question est celle-ci :
quand tu lui passes ta page frmlogin ta methode sait qu'elle est de
type class_default. donc quand tu peux faire une frmlogin.setNckName()
il te suffit de caster dans ta méthode comme ceci.
_Default toto = mapage as _Default.
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 20 juil. 2006 à 14:23
Une autre solution est de passer par la reflection mais c'est un peu lourd *-) une interface c'est beaucoup plus propre ;-) et surtout ca évite que tes 2 couches soient dépendantes l'une de l'autre ...
Ce que tu peux faire pour ton problème c'est un gestionnaire d'évenement !
t'as une classe connectionManager qui possede un evenement ChangeState les "clients" (tes pages) s'abonnent à cet évenement et dés que le connectionManager lance l'evenement tous tes clients sont updaté ...