Parfois vous voulez permettre à vos utilisateurs de faire des saisies dont vous ignorer le nombre. On peut imaginer par exemple une page permettant d'envoyer plusieurs fichiers vers un serveur web. Pour cela, il serait vraiment intéressant de pouvoir ajouter dynamiquement des champs sur votre page WEB. La technique présentée ci-dessous va nous permettre de réaliser cela coté client avec du JQuery (mais sans AJAX). On traitera le formulaire dynamiquement créé dans le code behind en accèdant directement au dictionnaire Request.Form. Premièrement, le code ASPx se compose d’une formulaire standard ASP :

    

Le bouton btAdd va servir à ajouter dynamiquement les champs de saisie sur la page. 
Pour cela on utilise le code JQuery ci-dessous (N'oublions pas de charger jQuery depuis 
par exemple le cdn google : http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js). 
Au passage, ce script maintient à jour le champ caché hfEntries qui sera exploité coté serveur pour récupérer les entrées ajoutées dynamiquement.

    

Le bouton btPost déclenche un POST-Back vers le serveur. Pour récupérer les champs dynamiquement créés dans l’événement click du bouton, on parcourt le dictionnaire Request.Form à l'aide du contenu de hfEntries :
public partial class _Default : System.Web.UI.Page
{
    private string[] _entries; 
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (hfEntries.Value != string.Empty)        
            _entries = hfEntries.Value.Split(new char[] { ';' });        
    }    

    protected void btPost_Click(object sender, EventArgs e)
    {
        foreach (var clef in _entries)
            Response.Write(string.Format("{0} = {1}
", clef, Request.Form[clef])); } }
Voila pour le principe. Maintenant, il faut gérer la reconstruction des champs créés dynamiquement pour pouvoir présenter la page après son traitement coté serveur. Et la les problèmes commencent car dès que l'on va vouloir ajouter dynamiquement un contrôle à la page, on va faire face au problème de validation des événements ASP.NET. Ce mécanisme introduit à partir du Framework 2.0 a pour objectif de détecter les codes malicieux qui tentent de modifier un formulaire coté client pour faire de l'injection de données. Et c'est exactement ce que nous essayons de faire. Nous ajoutons des champs dans le DOM coté client qu'ASP n'avez pas prévu de traiter lors du postback. C'est à ce moment que l'erreur apparait. Tous les contrôles placés dans le fichier ASPX sont traités par ASP.NET lors du rendu de la page qui va les déclarer comme "autorisés" lors d'une requête en fonction de leur état (Enable, Visible, valeurs autorisées, ...). Pour les contrôles qui sont générés dynamiquement c'est à nous de le faire. On va d'abord créer les contrôles dynamiquement dans le Page_Load en reprenant ceux présent dans le Request.Form :
protected void Page_Load(object sender, EventArgs e)
{
	if (hfEntries.Value != string.Empty)
	{
		_entries = hfEntries.Value.Split(new char[] { ';' });
		foreach (var clef in _entries)
		{
			TextBox tb = new TextBox();
			tb.ID = clef;
			tb.Text = Request.Form[clef];
			pEntries.Controls.Add(tb);
			pEntries.Controls.Add(new HtmlGenericControl("/br"));
		}
		htInitialId.Value = Convert.ToString(_entries.Length);
	}
}

Ensuite, on doit "autoriser" un certain nombre de champs dans le rendu de la page pour que les postback soient acceptés. Oui mais combien ? Et bien nous ne savons pas puisque l'utilisateur peut en ajouter autant qu'il le désire coté client. Pour la simplicité de la démonstration, je déclare 10 champs de saisie comme étant "acceptés" lors du postback :

protected override void Render(HtmlTextWriter writer)
{
	for (int index = 0; index < 10; index++)
		Page.ClientScript.RegisterForEventValidation("tb_" + Convert.ToString(index));
	
	base.Render(writer);
}