octobre
2009
Ce cher Jérôme me faisait remarquer à juste titre que cette entrée de la FAQ : Peut-on avoir plusieurs formulaires avec runat=server dans une même page ? n’était pas très étoffée…
Et il a tout à fait raison.
Mais pourquoi ne peut-on pas avoir plusieurs formulaires avec runat=server sur une même page ?
Il serait d’ailleurs plus judicieux de préciser qu’on ne peut pas avoir plusieurs formulaires visible sur la même page.
En effet
1: <form id="form1" runat="server">
2: </form>
3: <form id="form2" runat="server" visible="false">
4: </form>
ne posera pas de problème d’exécution, tandis que :
1: <form id="form1" runat="server">
2: </form>
3: <form id="form2" runat="server">
4: </form>
levera l’HttpException suivante :
A page can have only one server-side Form tag.
Le modèle de programmation à formulaire unique (Single Form Model) est fait de manière à n’avoir qu’une seule balise form visible, avec l’attribut runat = server. Cela permet à ASP.NET de gérer les contrôles qui sont posés dans le formulaire, ayant la balise runat=server, coté serveur. Cela permet entre autre de pouvoir y accéder dans le code behind directement.
Le modèle de développement impose que les éléments de formulaire soient postés à la même page qui les a soumis, ce qui permet aux mécanismes d’ASP.NET (ViewState, etc …) de fonctionner correctement.
Pour la curiosité, la pile d’appel au moment de l’exception nous permet de constater que l’exception est levée au moment de l’appel à la méthode System.Web.UI.Page.OnFormRender()
Un petit coup de reflector nous permet de voir
1: internal void OnFormRender()
2: {
3: if (this._fOnFormRenderCalled)
4: {
5: throw new HttpException(SR.GetString("Multiple_forms_not_allowed"));
6: }
7: this._fOnFormRenderCalled = true;
8: this._inOnFormRender = true;
9: }
Cette méthode OnFormRender est appelée au moment du rendu du contrôle HtmlForm. Le code issu de Reflector nous permet bien de constater qu’un boolean est mis à vrai lors du rendu d’un contrôle HtmlForm. Si ce boolean est déjà à vrai, alors l’exception est levée.
Cette entrée de faq sera modifiée à la prochaine (très bientôt) mise à jour.
1 Commentaire + Ajouter un commentaire
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
Super nico !
Merci pour l’info.