2009-10-15 6 views
0

Je génère des éléments HTML à la volée en utilisant javascript. Ces contrôles sont situés dans un panneau de mise à jour du navigateur.Obtention de contrôles HTML générés dynamiquement lors de l'utilisation de UpdatePanel

Pour une raison quelconque, je ne parviens pas à accéder à ces éléments dans le tableau Page.Form [].

Y a-t-il une raison à cela?

Ma solution actuelle crée un tableau de chaînes, transforme cela en chaîne JSON, stocke cela dans une variable cachée qui est renvoyée au serveur car le champ caché a été défini auparavant dans le code côté serveur.

Markup

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 

    <ContentTemplate> 
    <div id="dynamicInputsGoHere" class="hiddenContent" runat="server"></div> 
    </ContentTemplate> 

Javascript pour créer des entrées

for (i = currentSize; i < numberInputsToCreate; i++) { 
       html += "<input type='text' id='inputNum" + i.toString() + "' />"; 
      } 
$('#dynamicInputsGoHere').append(html); 

J'essaie d'accéder aux entrées dynamiques qui ont été générés par javascript lorsque les messages du panneau de mise à jour en arrière .

+0

Êtes-vous en train de dire que le champ caché dans lequel vous stockez des données est créé dynamiquement à partir du client lui-même ...? – deostroll

+0

Il y a très probablement une raison à cela, oui. Cependant, il est peu probable que nous travaillions sans aucun code à regarder. Le panneau est-il à l'intérieur de l'étiquette de formulaire? Comment générez-vous les éléments de formulaire (et définissez les noms, peut être problématique dans IE), etc ... – bobince

+0

Vous vous compliquez la vie. Le but du contrôle UpdatePanel est en premier lieu de pouvoir utiliser le code côté serveur pour alimenter une interface utilisateur "basée sur Ajax". Vraiment, vous pouvez soit utiliser le UpdatePanel, soit lancer l'Ajax vous-même. Ce n'est pas conçu/conçu pour être utilisé dans les deux sens. –

Répondre

4

Vous devez donner vos éléments d'entrée un name attribute afin pour eux de se soumettre à la forme (et disponible en Request.Form):

for (var i = currentSize; i < numberInputsToCreate; i++) { 
    var name = "inputNum" + i; 
    html += '<input type="text" id="' + name + '" name="' + name + '" />'; 
} 

$('#dynamicInputsGoHere').append(html); 

ensuite sur le serveur, les accès comme:

string value0 = Request.Form["inputNum0"]; 
string value1 = Request.Form["inputNum1"]; 
string value2 = Request.Form["inputNum2"]; 

Il est probablement préférable d'envoyer numberInputsToCreate dans un champ masqué (type="hidden") et d'utiliser une boucle sur le serveur pour extraire les valeurs.

1

Je pense qu'il n'est pas possible d'accéder aux éléments HTML créés par javascript dans codebehind.

Ces contrôles n'ont pas de propriété runat = "server". Il n'est donc pas possible d'obtenir ces commandes dans codebehind.

0

Question: Cette programmation existe-t-elle dans un MasterPage ou UserControl ou tout autre contrôle qui implémente INamingContainer? Vérifiez votre code HTML rénéré et assurez-vous que vous avez effectivement un <div id="dynamicInputsGoHere"> puisque vous l'avez défini comme runat="server" vous pourriez très bien avoir quelque chose comme <div id="ctrl0_dynamicInputsGoHere"> et par conséquent votre jQuery ne s'exécutera pas.

Une fois que vous avez vérifié

ScriptManager.RegisterStartupScript(this, this.GetType(), "createinputs", @";for (var i = currentSize; i < numberInputsToCreate; i++) { 
    var name = ""inputNum"" + i; 
    html += '<input type=""text"" id=""' + name + '"" name=""' + name + '"" />'; 
} 
$('#dynamicInputsGoHere').append(html);", true); 

l'entrée de sont trouvées par votre script, vous aurez probablement envie de script enregistrer avec le ScriptManager (juste pour être sûr, puisque vous utilisez le UpdatePanel.) Lorsque votre recherche de valeurs dans le code derrière vous devrez vérifier Request.Form["inputNum"+i].

Questions connexes