Asp.net les composants avec les formulaires

Signaler
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008
-
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008
-
SAM

Plusieurs de mes pages contiennent des composants avec des objets asp.net donc, nécessitant un form runat="server"

Il est impossible de mélanger plusieurs form runat="server" dans une même page et donc, quand un composant intégré dans la page contient déjà un form, on ne peut pas en mettre un dans la page.

La solution est alors de créer encore un autre composant même si il n'est utilisé que par cette page.

J'ai une page qui ne connait pas à l'avance le composant qu'elle doit ajouter. Elle choisit ce composant en fonction d'une langue.

J'aurais voulu l'intéger à l'aide du LoadControl(fichier)
dans laquelle fichier est un chaine de caractere écrite en fonction du composant à charger. Mais ce composant contient une form runat="server" et il refuse de le charger. pourtant, toutes les parties de la page nécessitant un form sont dans des composant (la page n'en contient pas).

Si qq voit le problème et connait un moyen de le résoudre.

13 réponses

Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Je m'aperçoit que c pas très clair alos je vais mettre un bout de code :

Ma page : toto.aspx
Elle contient un composant toto_partie1.ascx
et ne connait pas le deuxième composant (soit toto_fr.ascx, soit toto_esp.ascx, soit toto_uk.ascx, donc en fonction d'un parametre en fin.

Le premier contient un form runat="server"
Le deuxieme aussi
Et asp.net refuse de le charger en me disant qu'il ne peut pas avoir deux form runat="server " dans une meme page

Hors, j'ai déjà des pages qui contiennent plusieurs composants, chacun avec son form runat="server"

Est-du au faite que dans ce cas, je charge le deuxième composant avec LoadControl
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
dans un ascx, tu ne dois pas mettre form runat="server" sinon ca marche pas
enleve cette balise dans ton ascx si tu as mis une en tete enleve la aussi, tu ne dois avoir que le code que tu mettrais à l'interieur de form runat=server dans une page

@+

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Ben justement, j'ai essayé.

J'ai mis le form runat="server" dans ma page encadrant les deux composants.

Mais il me dis que les LinkButton (de mon composant) doivent être encadré par un form runat="server" et ça marche pas plus.

Ben , je vais réessayer aujourd'hui.
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Apres mon nouvel essai, les composants étant en code-behind, il me demande de placer les éléments entre des balises form runat="server".

En faites, ca marche bien si la page ne contient que des composants même si chacun possède son propre form runat="server". En revanche, quand tu as un composant avec un form runat="server", tu ne peux pas mettre un form directement dans ta page. Il faut alors refaire un composant.

C'est un peu pénible, surtout qu'en HTML, tu peux avoir 15 formulaires que ca l'empeche pas de vivre. Mais bon, soit. En revanche, même si tu fais que des composants, ta page ne contient alors aucun form, c les composants qui les contiennent. Et bien tu peux pas te servir du LoadControl. C'est comme si tu mettais un form dans ta page et c'est refusé.

Enfin, je me régale quand même dix fois plus à coder en .net mais nos amis de chez microsoft n'ont pas pensé à tout et plein de choses faciles en asp 3 deviennent complexe en asp.net.
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

ben décidement, je comprends plus.

J'ai une page avec deux composants chacun ayant chacun leur propre form et ca marche tres bien.

Sur mon autre page, je fais la même chose et ca passe pas, il n'accepte pas.

Si j'enleve les form des composants et que j'en mets qu'un dans la page, il me réclame les form pour les composants.

Galère.
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

En faites, la page ou ça marche, les formulaires sont dans des Panels affichés à tour de rôle. Donc, un seul form par page n'est possible. Mais comment faire alors quand on veut des composants à intégrer à toutes les pages avec son propre code-behind (par exemple, un composant pour une identification, un autre pour changer la langue des pages...) et qui nécessite que les contrôles serveur soit entourés par des form.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
je ne vois pas ou est le problème.

normalement ton ascx n'a aucune balise <form />

ensuite dans ton aspx tu fais tout simplement

<form runat="server" id="form1">

</form>
il faut bien sur avoir auparavant déclarer ton controle

tu peux aussi faire par page.LoadControl("Toncontrole.ascx")

mais tu n'as pas as t'embeté avec tes balises <form>

si ca marche pas, montre moi ton code que je comprenne ce que tu veux dire :)

@+

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Footer.ascx

<%@ Control Language="c#" Inherits="Magazine.Footer" %>
<form runat=server>

</form>
(avec d'autres balises html standard autour)

Ma page incorpore ce .ascx mais si j'enleve le form de ce composant pour le mettre dans la page, il me dit que les ImageButton doivent être dans des balise form runat=server.

Si je les laisse, comme j'ai un autre composant qui a des balises form, il me dit qu'il ne peut avoir qu'une balise form par page.

Le code-behind est censé exécuté les évenements OnClick pour changer des valeurs dans des variables de session.
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

J'ai le même problème, même si j'enlève aussi la balise form de mon autre composant pour l'encadrer avec le footer dans une balise form dans la page.

MaPage.aspx

<form runat=server>
<Magazine:composant1 ...>
<Magazine:Footer ...>
</form>

Il me dis que les ImageButton doivent être encadré par des balises form.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
normalement : tu fais ca :

MaPage.aspx

<form runat=server>
<Magazine:composant1 ...>
<Magazine:Footer ...>
</form>

Footer.ascx

<%@ Control Language="c#" Inherits="Magazine.Footer" %>

Et moi qd je faisais comme ca ca marchait

@+

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

J'ai essayé ta solution mais à chaque fois je me fais jeter. Je me suis demandé si c'était pas parceque le controle avait du code-behind pour son fonctionnement qu'il avait besoin de balises form à l'intérieur du composant.

Je vais rééssayer ta solution puisque tu me dis que ça marche chez toi, mais hors de mon projet, dans un truc plus simple ou je testerais juste la solution avec une page et deux composants.

Je verrais bien et je laisserais un message sur ce forum sur le résultat. En tout cas, merci et @+
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
j'ai vu aussi dans les exemples que tu mettais qu'il n'y avait pas d'attribut id or cet attribut est obligatoire et en code behind, il n'y a pas besoin de mettre onclick dans la balise ...

@+

Cyril
Messages postés
52
Date d'inscription
jeudi 1 janvier 2004
Statut
Membre
Dernière intervention
22 juillet 2008

SAM

Si l'id y est, j'ai oublié de le mettre dans l'exemple
Mais si tu mets pas OnClick, comment tu sais quel est le nom de la fonction qui va réccupérer l'évenement sur ton ImageButton.

Je fais

et dans le code-behind du composant

public void Click1(Object sender,ImageClickEventArgs e)
{
// Mémorisation de l'image cliqué dans le Footer
// dans une variable de session utilisé par toutes les pages
Session["mavariable"] = ((ImageButton)sender).ID;
}

Mais c peut être le faites que je gère des évenements qui fait qu'il m'oblige à mettre les ImageButton dans un form