Internet Explorer (avec les paramètres par défaut, que je suppose en général sera en vigueur sur les ordinateurs de bureau de la Grande Unwashed) semble ne pas aimer l'idée d'accepter le contenu des pièces jointes dans une réponse HTTP si la demande correspondante n'a pas été faite directement à partir d'un action de l'utilisateur (comme un gestionnaire « clic », ou une forme native présenter). Il y a probablement plus de détails et de nuances, mais c'est le comportement de base qui me frustrant. P>
Il me semble que cette situation est commune: l'interface utilisateur devant un contenu téléchargeable - disons, un rapport PDF préparé - permet pour certaines options et entrées à utiliser dans la création du contenu. Maintenant, comme toutes les formes qui permettent à l'utilisateur de comment une application stipule fait quelque chose, il est possible que l'entrée sera erronée. Pas toujours, mais parfois. P>
Ainsi il y a un dilemme. Si le client essaie de faire quelque chose de fantaisie, comme exécuter une opération AJAX pour laisser le vétérinaire du serveur le contenu du formulaire, puis soumettre à nouveau pour obtenir le téléchargement, IE ne sera pas comme ça. Il ne sera pas content parce que la transaction HTTP réelle qui porte le dos de fixation se produira pas dans le gestionnaire d'événements d'action-utilisateur d'origine, mais dans le rappel d'achèvement AJAX. Pire encore, depuis la barre de sécurité IE semble penser que la solution à tous les problèmes d'une est de recharger simplement la page externe de son URL d'origine, son invitation à l'utilisateur d'aller de l'avant et télécharger le contenu suspect ne sera même pas le travail. p>
L'autre option est d'avoir juste le feu de forme loin. Le serveur vérifie les paramètres, et si le mal de quoi que ce soit de là, elle répond avec la page sous forme conteneur, truffé de manière appropriée avec des messages d'erreur. Si le contenu du formulaire sont OK, il génère le contenu et l'expédie de retour dans la réponse HTTP en tant que fichier joint. Dans ce cas (je pense), IE est heureux parce que le contenu était apparemment directement demandée par l'utilisateur (qui est, par ailleurs, d'une façon ridiculement peu solide de dire un bon contenu du mauvais contenu). Cela tombe bien, mais le problème est maintenant que l'environnement client (qui est, le code sur ma page) ne peut pas dire que le téléchargement a fonctionné, de sorte que la forme est toujours juste assis là. Si ma forme est dans une sorte de dialogue, alors je vraiment besoin de fermer lorsque que l'opération est terminée. - vraiment, qui est l'une des motivations pour ce faire la façon AJAX p>
Il me semble que la seule chose à faire est de la forme équipent les boîtes de dialogue avec la messagerie qui dit quelque chose comme, « Fermer quand le téléchargement commence. » Cela semble vraiment boiteux pour moi parce que c'est un exemple d'un « s'il vous plaît appuyez sur ce bouton pour moi » Interface: idéalement, mon propre code devrait être en mesure de pousser le buutton quand il est approprié. Une chose clé que je ne sais pas est de savoir s'il y a un moyen de code client pour détecter que la soumission de formulaire a donné lieu à un téléchargement de pièce jointe. Je ne l'ai jamais entendu parler d'un moyen de détecter, mais qui brisaient l'impasse pour moi. P>
3 Réponses :
Il y a un nombre entier de vraiment bonnes raisons EM> c'est-à-dire cela, et je suis sûr que ce n'est pas quelque chose qui n'a personne se disputerait - alors l'objectif principal est donc de se déplacer d'une manière d'une certaine manière pour rendre les choses mieux pour vos utilisateurs. P>
Parfois, sa peine d'être repensé comment les choses sont faites. Peut-être désactiver le bouton, utilisez JavaScript pour vérifier lorsque tous les champs sont remplis et enflammer une demande Ajax une fois qu'ils sont. Si l'AJAX a réussi, activez le bouton. Ce n'est qu'une suggestion, je suis sûr qu'il y aura plus ... p>
Edit: Plus ... P>
Soumission simple (non Ajax) et si les chèques échouent, envoyez une page em> verso plutôt qu'une pièce jointe. La page renvoyée peut contenir toutes les informations soumises à l'origine (plus quel que soit le message d'erreur à l'utilisateur) afin que l'utilisateur n'a pas besoin de remplir à nouveau l'ensemble du formulaire. Et je suis aussi sûr qu'il y aura plus d'idées ... p>
Edit: Plus ... P>
Je suis sûr que vous avez vu ce type de chose avant - et oui, il est em> un clic supplémentaire (non idéal, mais pas difficile) .... AN "Si votre téléchargement échoue , cliquez ici "-> Dans ce cas, faites-le comme vous voulez le faire, mais ajoutez un nouveau lien / bouton de la page lorsque l'AJAX revient, donc si le téléchargement a échoué, ils peuvent soumettre le formulaire déjà validé d'un" action utilisateur direct ". Et je suis sûr que je penserai plus (ou quelqu'un d'autre le fera) ..... p>
Eh bien, je conviens que c'est-à-dire que c.-à-d. Cela fait pour des raisons «bonnes», mais dans une large mesure, ces raisons impliquent d'autres logiciels système ne sont pas très intelligents. Notez que Firefox et Safari et Chrome n'ont pas ce problème et à ma connaissance ne sont pas considérées comme une exposition de sécurité significative.
Je suppose que vous soumettez le formulaire avec une fenêtre cible différente; D'où la forme rester en place. p>
Il y a plusieurs options. P>
Soumettre code> de formulaire, puis soumettez-le et supprimez-le (ou éventuellement le masquer). Si la validation supplémentaire sur le serveur détecte un problème, elle peut renvoyer une page qui utilise JavaScript pour indiquer à la fenêtre d'origine de réafficher le formulaire. LI>
- Utilisez un cookie de session et un identifiant de formulaire unique (l'heure actuelle de
nouvelle date (). Gettime () code> ferait); Lorsque le formulaire est soumis, désactivez son bouton d'envoi, mais gardez-le visible jusqu'à ce que la réponse revienne. Faites de la réponse à un cookie de session avec cet identifiant indiquant le succès / l'échec. Avoir la fenêtre contenant le sondage de formulaire pour le cookie chaque seconde environ et agir sur le résultat quand il le voit. (Je n'ai jamais fait ce dernier; pas immédiatement em> voir pourquoi cela ne fonctionnerait pas.) Li>
ol>
Je m'attends à ce qu'il y ait environ une douzaine d'autres façons de cuire ce chat, mais ce sont trois qui sont venus à l'esprit. P>
(édition) em> Si vous ne soumettez pas à une cible différente, vous voudrez peut-être aller de l'avant et faire cela - à un iframe caché code> sur la même page . Cela (éventuellement combiné avec les réponses ci-dessus ou d'autres) pourrait vous aider à obtenir l'expérience utilisateur que vous recherchez. P>
Non, lorsque vous soumettez un formulaire et la réponse est une pièce jointe (c'est-à-dire un fichier à télécharger) le navigateur ne repeindre pas la page.
Ce dernier ressemble à une très bonne idée! Je me demande si le cookie serait défini avec succès si le téléchargement échoue. Idée brillante que cela fonctionne ou non!
@Pointy: Ah, d'accord, ça semblait un peu bizarre. Je pense que ces idées de base pourraient être adaptées à ce que vous faites, mais sans être au fond du tripes de celui-ci ... @Graza: c'est gentil. Je ne pense pas que j'appellerais ça "brillant" si ça ne marche pas, mais merci. :-)
L'idée de cookie est vraiment géniale, maintenant que j'ai permis de pénétrer la couche de graisse stagnante autour de ma tête. La technique doit être appelée le tour de cookie Crowder.
@ T.J. - Je voulais dire que l'idée était bonne. Il pense en dehors de la boîte, que vous devez faire beaucoup pour vous déplacer sur les murs que nous avons frappés dans le développement Web. Certaines idées fonctionnent, certaines ne - mais simplement parce qu'elles ne veulent pas dire qu'ils n'étaient pas bonnes idées
@Pointy: lol! Cool, content que ça ait travaillé. @Graza: Bon point, et merci encore.
@ T.J. Crowder Où avez-vous eu une idée numéro trois? Je pense que c'est généralement excepté que ce problème ne peut être résolu que par le numéro 1.
@Grae: Je l'ai proposé pour cette réponse - et je me suis immédiatement retourné et l'a utilisé sur un projet. Fonctionne un régal. Dans mon cas, j'utilise cette technique pour montrer un "bâtiment ..." boîte de dialogue modale (DIV) lorsque l'utilisateur demande un PDF personnalisé sur le serveur. Le formulaire soumet à une iframe cachée, puis mes sondages de code pour le cookie. Tout étant bien, la réponse revient avec disposition de contenu: pièce jointe code>, apparaissant la boîte de téléchargement; Mon code voit le cookie et ferme le modal. S'il y a une erreur, mon code voit l'erreur dans le cookie et le montre à l'utilisateur. Je dois vraiment bloguer cette w / une démo. :-)
J'ai combattu un problème similaire pendant un moment. Dans mon cas, la publication d'une iframe cachée n'a pas fonctionné si mon application Web était intégrée à une iframe sur un autre site (problèmes de cookie tiers) à moins que notre site ait été ajouté à la liste des sites de confiance. P>
J'ai trouvé que je pouvais briser le téléchargement en poste et obtenir une séquence. Le post renvoie un Court GUID surviennent qui peut être utilisé dans une demande d'initialisation du téléchargement. Le poste peut effectuer la validation de formulaire et renvoyer le GUID dans une réponse réussie. Une fois que le client a le GUID, vous pouvez définir la propriété SRC d'un élément iframe caché à l'URL de téléchargement. Le navigateur voit la "disposition de contenu": "pièce jointe" et donne à l'utilisateur un ruban de téléchargement pour télécharger le fichier. P>
jusqu'à présent, il semble fonctionner dans tous les derniers navigateurs. Malheureusement, vous devez vous modifier votre API côté serveur pour le téléchargement du fichier. P>
Cela fonctionne bien, mais sérieusement, le «truc de la cookie» est un moyen sûr et fiable de faire fonctionner les interactions.
@Pointy j'aime vraiment le tour de cookie et je suis sûr que cela fonctionnera bien pour vous. Je l'ai essayé, mais comme je l'ai dit, j'ai besoin de téléchargements pour travailler dans IE11 lorsque l'application Web s'exécute dans une iframe hébergée par une tierce partie. La pièce de cookie fonctionne, mais c'est-à-dire que cœe au ruban de téléchargement si j'essaie de poster un formulaire à une iframe cachée. - Je viens d'ajouter ma réponse au cas où quelqu'un pourrait le trouver utile.
Oui, ça peut faire une grande différence. Mon site est jolie vanille.