[ASP.net][C#] Séparation de la classe

Signaler
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007
-
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
-
Bonjour, bonsoir bonne nuit!
Je voudrais savoir s'il est possible de séparer une classe du reste du code en ASP.net!?

ex:
MaClasse{
   Attrib1;
   Attrib2;
   Attrib3;

   Func1(){}
   Func2(){}
   Func3(){}
}

void Page_Load(object sender, EventArgs e){
   MaClasse Obj1=New MaClasse;
   Obj1.Func1();
   ...
}

Voila mon exemple avec du pseudo code, j'ai différentes pages .aspx qui utilisent MaClasse, mais je voudrais savoir s'il est possible de mettre MaClasse dans un fichier d'entete (par exemple comme en C++, un #include et hop)!?
Et surtout je voudrais savoir comment on fait!?

En vous remerciant d'avance!

Y a rien a apprendre tout a comprendre

16 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
on ne peut pas faire d'include mais on peut faire du code behind, tu met ta classe dans un fichier .cs tu hérites ta classe de system.web.ui.page (attention à la casse)

puis tu rajotues ca dans le .aspx
<%@ Page Language="cs" Codebehind="404.aspx.cs" Inherits="BeaujolaisDurand.Erreur404"%>

ou BeaujolaisDurand.Erreur404 est le nom de ta classe

mais le mieux c'est quand meme de travailler avec VS.net qui fait tout ca automatiquement et bien plus encore

Cyril
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Quand tu me dis de faire hériter ma classe de System.Web.UI.Page, en fait je dois faire un using!?
genre:
using System.Web.UI.Page;

MaClasse{
Attrib1;
Attrib2;
Attrib3;

Func1(){}
Func2(){}
Func3(){}
}


ce code j'en fais un fichier classe.aspx.cs

et dans chaque fichier . aspx, je met tout en haut:
<%@ Page Language="C#" Codebehind="classe.aspx.cs" Inherits="MaClasse"%>

c'est bien ça!?
Ent tout cas merci ;)

Y a rien a apprendre tout a comprendre
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
c'est vrai que tout à l'heure j'etais peut etre un peu rapide, j'etais pressé, et je le suis toujours mais non c'est pas un using qu'il faut faire mais ca :

Public MaClass : System.Web.UI.Page
{

}

pour le reste c'est bon

@+

Cyril
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Merci beaucoup je vais pouvoir essayer ca demain!
Merci j'te tiens au courant sur le fonctionnement ;)
Sinon qqn m'as dis que je pouvais faire comme ca!

"Il te suffit d'intégrer ton code dans une classe C# indépendante, de lui attribuer un namespace puis de la référencer dans le code behind de ta page ASPX (mot clé using)."

Mais je trouve que ce n'est pas tres précis donc je vais essayer ta solution et voir pour la suite ;)

Bonne prog!

Y a rien a apprendre tout a comprendre
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
oui tu peux aussi faire la solution du dessus, mais si tu connais pas, et si tu n'as pas VS.net, faire ca à la main, ca va t'etre compliqué, mais si tu veux faire quelque chose de compliqué avec asp.net, VS.net est un outil presque indispensable, au moins pour débuter :)

Mais c'est vrai que la méthode ci dessus, est plus joli, ca depend aussi du contenu de la classe, mais dans la plupart des cas je ferais cette derniere méthode.

Je t'explique en deux mots

tu fais ta classe avec un namespace
je fais le code en C# mais je code jamais avec ce langage, alors il risque d'avoir des fautes

namespace Cyril
{
public Class Personne
{
public string Name;
public Int Age;
}
}

apres faut compiler cette classe en une dll via la ligne de commande, apres cette dll, tu la met dans le repertoire bin de ton application web dans ta page tu ajoutes un using Cyril;

dans le code tu pourras faire

Cyril.Personne oPersonne = new Cyril.Personne;
oPersonne.Name = "Cyril";
oPersonne.Age = 18;

Voila en gros le principe de la deuxieme méthode, la premiere méthode peut etre utilisé pour ton cas, mais apres reflexion c'est pas vraiment ce que tu voulais faire, je pensais que tu avais des pages qui avait un comportement identique, donc dans la premiere solution, ta classe qui derivait de page, tu aurais pu avoir

public sub Page_Load(...) handles Me.load '(en vb)
end sub

c'est à dire que tu n'aurais plus eu le code de la gestion de la page dans ton aspx

donc finalement je te conseil la deuxieme solution qui est beaucoup plus prevu pour faire ca :D

j'espere ne t'avoir pas trop embrouillé, désolé d'avoir mal compris ta réponse

Cyril
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Bah je pense que ce que tu me dis de faire c'est qu'il vaut mieux utiliser la technique avec le namespace, mais tu me dis de compiler ma classe et d'en faire une dll!!, mais comment qu'on fais pour compilé en dll dans WebMatrix ou simplement sans VisualStudio.net?
Je vais regarder un peu sur le site, me ballader quoi!
Sinon merci pour tout tes renseignement ;)

Y a rien a apprendre tout a comprendre
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
avec webmatrix malheureusement c'est pas prevu pour

il faut utiliser le "programme" csc qui se situe ici :
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
faut faire ca sous dos, tu te met dans le dossier ci dessus et tu tapes cette ligne de commande
csc tonfichier.cs /t:library
je crois que c'est qqchose comme ca, mais je m'en sers jamais, regarde sur le net si c'est pas le cas

Cyril
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Tu as presque raison pour ce qui est de la compilation de fichier en dll c'est:
csc /t:library Tonfichier.cs

sinon j'ai essayer d'utiliser les technique j'ai fini par avoir un mix des 2, lol!

Fichier.aspx.cs
MonEspace{
   MaClasse::System.Web.UI.Page
   {
      Attrib1;
      Attrib2;
      Attrib3;

      MaClasse(String titi); //constructeur
      Func1(){}
      Func2(){}
      Func3(){}
   }
}


Fichier.aspx
<%@ Page Language="C#" Inherits="MonEspace.MaClasse" Src="Fichier.aspx.cs" %>
...
<script runat="server">
//mon code
MonEspace.MaClasse Obj= new MonEspace.MaClasse(string toto); //c'est mon contructeur
...
</script>

Malheureusement dans cette condition il me dis que je ne peux pas surcharger MaClasse:

"CS1501: No overload for method 'BaseAccess' takes '0' arguments"
"[No relevant source lines]"
"Source File: c:\WINNT\Microsoft.NET\Framework\v2.0.40607\Temporary ASP.NET Files\root\c64f34cd\904ad10a\95g_6ix0.0.cs"

Bizar nan!?
Sinon si je compile en .dll et et que je passe "Src=Fichier.aspx.dll" dans le fichier "Fichier.aspx"
Bah grosse erreur:
"There is no build provider registered for the extension '.dll'. You can register one in the <compilation> section in machine.config or web.config. Make sure the appliesTo attribute includes the value 'Web' or 'All'."

Bon je vais me creusé le crane encore un peu, j'te tien au courant!en tout cas merci pour le coup des .dll, ca marche nikel chrome!
;)

$€B@$T!€~

Y a rien a apprendre tout a comprendre
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
La méthode que t'as fait ne peut pas aller, tu ne peux pas surcharger ta classe c'est du au constructeur de page.

il ne faut pas que tu hérites ta classe de page, que tu compiles en dll, (ma ligne de comande ou la tienne doit etre equivalente :) ) puis tu met cette dll dans le dossier bin de l'application web, il faut que tu fasses un using MonEspace et normalement ca doit marcher !

si ca marche pas ce soir, j'essaierais et je te dirais comment faire :)

@+

Cyril
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Ouah re salut apres tant de temps... j'ai pas eu le temps de trop continuer a toucher ce que tu m'as proposé, donc j'essaye de voir un peu plus tard mais je te tiens au courant ;)

Y a rien a apprendre tout a comprendre
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Pffff, ohlala j'suis tout perdu!
Bon mon code je vais te le montré!ca ira plus vite! lol

ma classe de BdD (.apsx.cs) compilé en .dll:
namespace MaClasse{

    /**************************************/
    /* CLASSE D ACCES A LA BASE DE DONNEE */
    /**************************************/

    public class BaseAccess //:System.Web.UI.Page
    {
        private string filename;
        private string connStr;
        private System.Data.OleDb.OleDbConnection oConn;
        private System.Data.OleDb.OleDbDataReader reader;
        private System.Data.OleDb.OleDbCommand oCmd;

        // type record contenant le nom d'une colonne et sa valeur associée
        public struct record
        {
            public record(string column_name, object content)
            {
                this.column_name = column_name;
                this.content = content;
            }

            public string column_name;
            public object content;
        }

        // constructeur nécessitant le path du fichier base de donnée Access
        public BaseAccess(string filename)
        {
            this.filename = filename;
            this.connStr = "Provider=Microsoft.Jet.OLEDB.4.0;"+
                          "Ole DB Services=-4;"+
                          "Data Source="+filename;
        }

        // Lit la variable reader
        public System.Data.OleDb.OleDbDataReader GetReader()
        {
           return this.reader;
        }

        // Précise si il y a des colonnes
        public bool BdD_Read ()
        {
            return reader.Read();
        }

        // Lit un champ de la BdD
        public string BdD_GetString(int index)
        {
            return this.reader.GetString(index);
        }

        // établie une connexion sur la base Access
        public bool Open_BdD()
        {
            try
            {
                this.oConn = new System.Data.OleDb.OleDbConnection(this.connStr);
                this.oConn.Open();
                return true;
            }
            catch
            {
                return false;
            }
        }

        // ferme la connexion à la base Access
        public bool Close_BdD()
        {
            try
            {
                this.oConn.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }

        // execute une requête SQL sur la base Access
        public bool Execute(string ordre)
        {
            try
            {
                this.oCmd = new System.Data.OleDb.OleDbCommand(ordre,this.oConn);
                this.reader = this.oCmd.ExecuteReader();
                return true;
            }
            catch
            {
                return false;
            }
        }

    }
}


et l'entete et un bout de mon code dans ma page .aspx
<%@ Page Language="C#" codebehind="NewFilou.aspx.cs" autoeventwireup="false" Inherits="MaClasse.BaseAccess" Src="bin\NewFilou.aspx.dll" %>
<%@ import Namespace="System" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.SqlClient" %>
<%@ import Namespace="System.Collections" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server">

    /*************************************************/
    /* UTILISATION DE LA BASE DE DONNEES AU CHARGEMENT DE LA PAGE HTML */
    /*************************************************/
    
    void Page_Load(object sender, EventArgs e) {
    
        String Path = "C:\\Documents and Settings\\Administrateur\\Mes documents\\ASP\\BdD\\login.mdb;";
        MaClasse.BaseAccess LogPass= new MaClasse.BaseAccess(Path);
    
        LogPass.Open_BdD();
        LogPass.Execute("SELECT [Table1].[Log], [Table1].[Pass] FROM [Table1]");
    
        //Affichage sur la page Html
        DataGrid1.DataSource = LogPass.GetReader();
        DataGrid1.DataBind();
    
        LogPass.Close_BdD();
    
    }



J'ai essayé pas mal de truc rien ne fonctionne :sad)
Allez stp explique moi une derniere fois quelles sont mes erreurs, pleeeeaaaase!

Allez bonne soirée, journée, matinée a tous ;)

Y a rien a apprendre tout a comprendre
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Je viens de rentrer dans long week end de foire et je suis un peu crevé, j'ai vaguement regardé ton code et c'est l'en tete qui m'a pas l'air bonne

<%@ Page Language="C#" codebehind="NewFilou.aspx.cs" autoeventwireup="false" Inherits="MaClasse.BaseAccess" Src="bin\NewFilou.aspx.dll" %>

supprime l'attribut src

> <%@ Page Language="C#" codebehind="NewFilou.aspx.cs" autoeventwireup="false" Inherits="MaClasse.BaseAccess" %>

et je pense que ca doit etre bon, mais pas sur

@+

Cyril
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
dsl pour le lien, je suis vraiment fatigué ;)

url

Cyril
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

J'ai fais comme t'asdis grand patron, mais, ...ca ne fonctionne paaaaas [:'(] ca me donne cette erreur:
"Parser Error Message: 'MaClasse.BaseAccess' is not allowed here because it does not extend class 'System.Web.UI.Page'."

Bououououuu, j'en peux plus, nan mais bon je crois que je vais lacher l'affaire avec WebMatrix j'essayerais avec VS.net en esperant avoir de meilleur resultat!
Qu'est ce que je veux dire, sinon, tu ne sais pas si il y a un bon tuto sur les cookies sur le site ou ailleurs? je vais fouiner un peu normalement je devrais trouver car la derniere fois j'en ai vu un interessant mais...j'ai oublié de gardé l'URL!

Allez bonne bourre et prog. a toi, fils de vigneron ;)

Mets spiderman comme sonnerie de téléphone à ta copine si tu trouve pas d'autre moyen de la faire grimper au plafond
Messages postés
52
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
11 avril 2007

Au fait rien a voir non plus mais tu n'aurais pas un site qui parle un peu de comment faire un chat ?
Ce qu'il faut connaitre, enfin des explications quoi, merci pour tout allez je crois que j'attend ton message et que je cloture ce message !

Mets spiderman comme sonnerie de téléphone à ta copine si tu trouve pas d'autre moyen pour la faire grimper au plafond (Dixit SFR)
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
pour les cookies, sur le site, sinon demande moi, je fais ca, pour le chat je sais pas.

pour ton problème, il faut faire hériter ta classe de Page, j'avais pas vu lors de mon precedent post, mais tu l'as pas fait heriter, tu l'as mis en comment :big)

public class BaseAccess : System.Web.UI.Page
{
private string filename;

Cyril