Facebox ajoutant des virgules à l’entrée

J’utilise une facebox pour afficher un formulaire à l’intérieur d’une lightbox, rien de très excitant (juste un couple de datepickers, des zones de texte et une case à cocher). Cependant, j’ai des problèmes avec les publications (postbacks), chaque fois que je poste en retour dans la zone de liste, il ajoute un ‘,’ au début de l’entrée (le “lapin” devient alors “, le lapin”) problème avec le modalpopup extender de ajaxcontroltoolkit, donc je suppose que c’est un problème courant.

Quelqu’un peut-il expliquer pourquoi cela se produit ou me dire comment y remédier? fournir un moyen décent de résoudre ce problème? En fait, je l’ai fait et cela fonctionne très bien, mais je ne veux pas vraiment répondre à ma propre question sur les primes, alors quelqu’un d’autre tente le coup!

Cordialement, Ed

MODIFIER

Voir la réponse ci-jointe pour une solution correcte (j’ai finalement résolu ce problème, mais je ne voulais pas gâcher la question de la prime, laissant la réponse jusqu’au lendemain).

Pourquoi ne coupez-vous pas la sortie? supprimez simplement le ‘,’ pour chaque chaîne

Je n’ai jamais programmé dans ASP.NET ni utilisé Facebox, mais voici quelques solutions de ma petite recherche qui pourraient fonctionner.

Il y a une fonction de reveal dans la source facebox où le clonage réel est effectué:

 reveal: function(data, klass) { $(document).sortinggger('beforeReveal.facebox') if (klass) $('#facebox .content').addClass(klass) $('#facebox .content').append(data) // <--- This does the cloning 

La virgule supplémentaire provient évidemment du champ de formulaire d'origine qui a été répété. Vous pouvez lier une fonction click () au bouton d'envoi qui soumet le formulaire et, dans cette fonction, supprimer l'un des clones. Étant donné que cette fonction doit être exécutée avant le traitement des données de formulaire, les doublons doivent être traités.

 $("#my-submit-button").click(function() { $('#facebox .content').empty(); } 

Si cela ne fonctionne pas, alors ce sera sûrement. Facebox a un tas de points d'ancrage pour exécuter votre code après divers événements. L'un des crochets est reveal.facebox ou afterReveal.facebox . Étant donné que le clonage est effectué lors de la révélation, vous devez associer une fonction personnalisée à exécuter lors de cet événement. Dans cette fonction, vous devez également modifier l'identifiant / le nom de tous les éléments. Ajoutez un mot aléatoire comme _temp ou quelque chose pour chaque élément. Pas le code exact, mais j'espère que vous avez l'idée.

 (document).bind('reveal.facebox', function() { $("#facebox .content > *").each( // change the id's/name's ); }); 

Modifier :

En regardant le HTML pour les exemples Facebox, on dirait qu’il habite dans son propre

et copie tout ce qui doit être montré dans ce div. Ainsi, la structure d'un exemple de page facebox pourrait ressembler à ceci:

  .. 
// original form controls go here, probably hidden
...
// the original form is copied inside this space and then displayed // this is the one the user interacts with and makes changes to
...
..

Donc, sur la base de cette structure et de cet exemple, la zone de saisie avec id=theId apparaît dans div#myForm et div#facebox . div#facebox est celui avec les valeurs mises à jour dont nous avons besoin.

Ok, voici comment je l’ai corrigé:

en changeant

     fonction fillFaceboxFromHref (href, klass) {
 ....
         if (href.match (/ # /)) {
             var url = window.location.href.split ('#') [0]
             var target = href.replace (url, '')
             $ .facebox.reveal ($ (cible) .clone (). show (), klass)
 ....
     } 

à

     fonction fillFaceboxFromHref (href, klass) {
 ....
         if (href.match (/ # /)) {
             var url = window.location.href.split ('#') [0]
             var target = href.replace (url, '')
             $ .facebox.reveal ($ (cible) .show (), klass)
 ....
     } 

arrêtera le clonage de l’entrée et utilisera à la place le div actuel.

Ensuite, il s’agit simplement de ré-append le contenu interne à #aspnetform (ou #body tel qu’il a été utilisé à l’origine [vous devez modifier cela pour autoriser les publications sur asp.net]) avant d’être effacé dans la liaison close.facebox, comme alors:

     $ (document) .bind ('close.facebox', function () {
 /// deux lignes ajoutées pour rappend le contenu dans #aspnetForm, avec display: none;  (ie invisible)
         $ ('# facebox .content'). children (). css ({'display': 'none'});
         $ ('# aspnetForm'). append ($ ('# facebox .content'). html ());
 /// ligne supplémentaire pour vous assurer qu'il n'y a pas d'effet clignotant lors de la fermeture de la facebox: le contenu est toujours là aussi!
         $ ('# facebox .content'). children (). css ({'display': 'block'});
 .... 

Cela utilisera maintenant la div originale comme contenu, en évitant le problème des virgules. Cependant, si vous vouliez utiliser une div qui était visible sur la page à l’origine, il serait alors nécessaire de faire quelques tours supplémentaires dans la liaison close.facebox.