ASP.NET MVC, Ajax.BeginForm mange params de soumettre le bouton cliqué. Ressemble à un bug
Si vous êtes en utilisant Ajax.BeginForm() avec plusieurs boutons de soumission similaire à ceci:
//View.aspx
<% using (Ajax.BeginForm("Action", "Controller",
new AjaxOptions { UpdateTargetId = "MyControl", }))
{ %>
<span id="MyControl">
<% Html.RenderPartial("MyControl"); %>
</span>
<% } %>
//MyControl.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<input name="prev" type="submit" value="prev" />
<input name="next" type="submit" value="next" />
//...
Tout est soumis au contrôleur amende, mais les paramètres de la soumettre le bouton qui a été cliqué sont absents de la Demande. Dans otherwords Demande["suivant"] et de la Demande["prev"] sont toujours nulles.
J'ai regardé dans le code JavaScript dans Microsoft.MvcAjax.js et il ressemble à la fonction Sys_Mvc_MvcHelpers$_serializeForm complètement saute au-dessus des entrées sont de type "envoyer".
Cela ne semble pas logique du tout. Sinon, comment pouvez-vous savoir quel bouton a été cliqué?
Il ressemble à un bug pour moi. Est-il une raison logique pour ignorer ces paramètres de formulaire?
- J'étais sous l'impression que l'AJAX formes utilisent généralement des entrées bouton plutôt que de se soumettre entrées, ou suis-je une mauvaise interprétation de ce que vous essayez de faire?
- Voulez-vous dire <input type="button"...? Si oui, le problème est le même. Quand il parcourt les paramètres du formulaire, il ne capte que les éléments avec tagName='input' et le type est l'un de la suite du texte, le mot de passe caché, case à cocher ou à la radio.
- Encore semble être un bug dans MVC 2.0
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: 2009-11-21
J'ai téléchargé MVC Version 2 avant-2 et a cherché à savoir si ce problème a été résolu.
J'ai fait un test rapide et a trouvé des résultats similaires pour MVC Release 2 Aperçu 1.
Je ne crois pas qu'il est encore fixée.
Mise à JOUR: 2009-08-07
J'ai téléchargé MVC Release 2 Extrait 1 et regarda pour voir si ce problème a été résolu.
Je vois une nouvelle fonction dans le script MicrosoftMvcAjax.debug.js appelé _serializeSubmitButton et je vois que lors de l'Ajax.BeginForm() rend la sortie il y a un événement onclick, mais lorsque cet événement se déclenche, il génère un message d'erreur "erreur d'exécution Microsoft JScript:" Sys.Mvc.AsyncForm' a la valeur null ou n'est pas un objet".
En bref, il ressemble à un correctif a été tenté, mais il n'est pas encore ou j'ai besoin de faire quelque chose de plus. La mauvaise nouvelle est que si elle n'est pas la plus tard, puis Ajax Formes sera cassé pour tout le monde jusqu'à ce que la réparation est terminée.
Mise à JOUR: 2009-05-07
J'ai reçu des commentaires aujourd'hui à partir de Microsoft confirme qu'il s'agit d'un bug. Ils ont enregistré le défaut et déclaré qu'ils espèrent avoir corrigé dans une future version.
Pour référence, je suis en laissant les détails de mon enquête que j'ai transmises à Microsoft. Appologies pour le long post, mais ce sera peut-être utile pour ceux qui cherchent à créer un travail autour..
Il y a quelques problèmes dans le support Ajax dans MVC. Pour illustrer, considérons le modèle illustré dans plusieurs exemples sur le web:
Prévu:
, Il est juste une liste que vous pouvez l'utilisateur peut la page de l'avant et à l'arrière sans mettre à jour l'intégralité de la page.
Compte tenu de cette configuration. J'attends 2 liens étiquetés "Prev" et "Next". En cliquant sur "Prev" faut tirer la PrevAction méthode dans le contrôleur en poste et de la valeur dans le champ caché nommé "startIndex" devrait être disponible dans les paramètres de la requête. - Je m'attendre à des résultats similaires en cliquant sur le lien Suivant.
Réel:
La réalité est que l'objet de la requête ne contient AUCUNE forme de paramètres, même s'il montre qu'il est venu dans un POST.
Afin d'obtenir l'un des paramètres à l'aide de l'action de lien, elles doivent être explicitement fournis par le biais de la variation de ActionLink qui contient des paramètres. Lorsqu'il est utilisé les paramètres de devenir une partie de l'URL du lien qui l'emporte sur l'objectif d'avoir un POSTE.
, Alors pourquoi est le javascript de mal?
J'ai fouillé dans le code javascript qui est utilisé pour traiter le soumettre pour l'exemple que j'ai posté ma question et maintenant, je comprends mieux pourquoi il ne veut pas s'en occuper. La raison semble être liée à la façon dont ils ont câblé des événements et de ce que je crois est un défaut dans Internet Explorer.
La façon dont il fonctionne actuellement, c'est que l'Ajax.BeginForm() de la classe helper génère une balise de formulaire avec un onsubmit() fonction d'intercepter le formulaire de soumission de l'événement. Lorsque l'utilisateur clique sur un bouton de soumission de la onsubmit() fonction feux et reçoit des paramètres, qui est celui de l'événement.
La MicrosoftMvcAjax les scripts lors de l'événement, combinez les propriétés du formulaire, qui sont censés être soumis et envoie la demande de congé pour le serveur. Le problème est que par WC3 de normes que la succès contrôles sont censés être affichés. Dans le cas de boutons submit, c'est le bouton qui a été cliqué sur réellement. Sous internet explorer il n'y a aucun moyen de déterminer quel bouton effectivement causé l'événement submit à feu de sorte que le script ne saute tous les boutons de soumission.
(Dans Firefox, l'événement contient une propriété appelée "explictOriginalTarget" qui pointe vers le bouton qui a causé l'événement en premier lieu)
Quoi la solution?
Microsoft devrait être de fixation. Cependant, si nous avons besoin de quelque chose plus tôt, je crois, la seule option est de pirater le MicrosoftMvcAjax scripts au fil des événements différemment. J'ai trouvé que le formulaire peut être relié à une poignée d'un événement mousedown où le bouton cliqué peut être enregistré dans une variable globale où le onsubmit gestionnaire peut s'insérer dans les paramètres post.
Voici un code que j'ai été le tester pour illustrer cette technique. J'ai confirmé qu'il travaille dans les deux IE8 et FireFox, mais je n'ai pas essayé de le pirater dans le MVC, Ajax scripts pourtant... Si j'ai plus de temps. Je peut poster les résultats ici.
Pour vos boutons de soumission à "succès" des contrôles conformément à la spécification, ils doivent être définis à l'intérieur de l'élément de formulaire:
http://www.w3.org/TR/html401/interact/forms.html#successful-controls
Si vous ne pouvez pas imbriquer vos boutons de soumission à l'intérieur de votre forme, vous aurez probablement besoin d'utiliser le javascript (jquery) pour soumettre votre formulaire et passe dans une autre paramater pour indiquer quel bouton a été cliqué.
Je suppose que cela a été corrigé dans MVC 2 (ou il n'a jamais été rompu). Assurez-vous que votre balisage HTML valide. L'exemple suivant devrait montrer ça fonctionne.
Vote.aspx:
VotingController.aspx:
J'ai eu le même problème aujourd'hui (8 octobre 2010) avec mon formulaire avec plusieurs boutons de soumission. Le HTML n'a pas de valider. J'ai nettoyé. C'est encore de ne pas valider (mais de moins en moins d'erreur que l'original) et maintenant la valeur de cliqué bouton est soumis.
Une solution possible pourrait être de chaque bouton dans une autre forme acheminés vers les différentes actions sur votre contrôleur.
Pas l'idéal, mais pourrait fonctionner.
Je n'ai suivantes:
c'est à dire défini un hidden input type avec l'id de "btnSubmit" et sur chaque bouton ajouté à l'événement onclick comme onclick="$('#btnSubmit').attr('value','Delete');". cela semble fonctionner
comme je l'ai été en mesure d'obtenir la valeur du bouton cliqué dans le contrôleur:
public ActionResult SaveCreateBlot(string btnSubmit)
{
}