2010-05-07 16 views
1

Je pense que ce n'est pas vraiment possible, mais peut-être que je me trompe. Je suis simplement déchiré entre ceux qui croient que seules les requêtes POST doivent modifier les données sur le serveur et les personnes qui assouplissent la règle et autorisent les requêtes GET à modifier les données.Soutien en cliquant sur un lien, mais en envoyant un POST (vs GET) sur le serveur, sans Ajax?

Prenez cette situation. Disons que vous avez une table, chaque ligne est une ligne dans la base de données. Je voudrais leur permettre de supprimer la ligne via une icône "X" fantaisie comme le dernier élément <td></td> dans la ligne. AFAIK, le seul moyen d'envoyer un POST au serveur est via un formulaire. Mais puis-je vraiment insérer un formulaire entier dans le dernier élément <td></td> juste pour faire un POST? Ou devrais-je tricher et utiliser un tag <a href=...></a> qui envoie une requête GET?

Vous pensez peut-être "Faites les deux! Envoyez un POST ET utilisez le tag <a ...></a> Utilisez javascript + xhr!" Et je vais dire, oh? Et comment cela va-t-il se dégrader dans un environnement javascript zéro?

Peut-être que nous avons atteint un point où il ne serait pas logique de s'inquiéter de se dégrader gracieusement? Je ne suis pas sûr. À vous de me dire? Je suis nouveau au développement web, mais je comprends la plupart des concepts impliqués.

Répondre

3

Vous n'avez pas besoin d'entasser un formulaire dans chaque td final - vous pouvez entourer la table entière avec un seul formulaire qui a un bouton de soumission dans chaque td final. Chacun a besoin d'une valeur de nom/id différente, par ex.

 
    <td><input type="submit" name="delete_172" value="Delete"></td> 
    ... 
    <td><input type="submit" name="delete_198" value="Delete"></td> 

Ensuite, le serveur recevra un delete_172=Delete unique sous la forme POST paramètres. Parcourez tous les paramètres pour correspondre delete_[0-9]+, fractionné sur le trait de soulignement, et vous avez l'ID d'enregistrement de l'enregistrement à supprimer, ou vous avez une clé de carte pour trouver l'ID d'enregistrement à supprimer (si vous souhaitez conserver les ID d'enregistrement la page pour la sécurité)

APRÈS cela fonctionne, attacher un gestionnaire d'événements JS à l'événement onSubmit de formulaire pour soumettre le tout à travers XHR et supprimer dynamiquement la ligne du tableau.

+0

Très agréable et propre! J'aime ça! Merci! – dlamotte

0

Je ne conseille pas d'ignorer la convention sur GET vs POST. Le bouton de retour et la page rafraîchit et des choses comme ça vont vous donner l'enfer. (Et chaque fois que vous soumettez une requête POST, redirigez vers une nouvelle vue, pour les mêmes raisons.)

Vous connaissez seulement vos utilisateurs, mais je pense qu'il est aujourd'hui plutôt acceptable d'avoir javascript dans une 'application web' et de laisser les gars non-js s'en tiennent aux «pages web». Quoi qu'il en soit, pour ce que ça vaut, j'aime parfois faire moins de fantaisie (que AJAX) javascript solution comme ça ...

Mettez un formulaire où vous voulez dans la page:

<form method="post" target="yourpage.ext" id="deleteRecordForm"> 
<input type="hidden" name="IdToDelete" value="" id="deleteRecordInput" /> 
</form> 

Pour votre lien :

<a href="#" onclick="deleteRecord(thisId);return false;">[x]</a> 

Enfin, le javascript:

<script type="text/javascript"> 
function deleteRecord (id){ 
    if (confirm ('Are you sure you want to delete this record?')){ 
    document.getElementById('deleteRecordInput').value = id; 
    document.getElementById('deleteRecordForm').submit(); 
    } 
} 
</script> 
+1

Etre un "mec no-js" vs (je suppose) un "yes-js guy" n'est pas le seul facteur. Certaines personnes sont tenues de respecter les consignes d'accessibilité de la section 508 des États-Unis, de sorte que le site * doit * fonctionner sans javascript.Les terminaux braille et (certains | beaucoup) lecteurs d'écran ne le font pas non plus, vous excluez donc les clients potentiels (et ils * peuvent * vous poursuivre en justice en vertu de l'ADA). ** Amélioration progressive ** plutôt que Dégradation gracieuse sont les nouveaux mots de veille. Faites fonctionner les bases * et ensuite * améliorez-le avec javascript. –

+0

@Stephen très bons points. Je n'avais aucune idée qu'il y avait des normes qui appliquaient ces choses! Cela a du sens cependant. – dlamotte

2

l'un des problèmes avec une demande GET modif Ying données est qu'en visitant les données de liaison est changé. Le lien ne peut même pas être parcouru par une personne, par ex. Google explore votre site. Frapper rafraîchir modifie également les données.

+0

Bon point. Quelque chose que je n'ai pas pensé, mais je veux absolument strictement utiliser les POST pour modifier les données côté serveur. Merci! – dlamotte