Dans mon fichier personDetails.cshmtl, j'ai la forme suivante:ASP.NET MVC - AJAX Envoyer un formulaire ne se déclenche pas l'événement approprié
<form id="userUpdateForm" method="post">
<fieldset>
<legend>User Details</legend>
<input type="checkbox" name="authorisedCheckbox" value="Authorised" id="authCheck" />Authorised<br />
<input type="checkbox" name="enabledCheckbox" value="Enabled" id="eCheck" />Enabled<br />
</fieldset>
<fieldset>
<input type="hidden" name="personId" id="idCheck" value='@ViewData["personId"]'>
</fieldset>
<input type="submit" value="Save Changes" name="Save Changes">
<button type="button">Cancel</button>
</form>
je puis Javascript plus loin sur la page suivante:
$('#userUpdateForm').submit(function (e) {
var personDetails = {
Enabled: $('#eCheck').val(),
Authorised: $('#authCheck').val(),
Id: $('#idCheck').val()
};
$.ajax({
type: "POST",
url: '<%= Url.Action("submitForm", "Home") %>',
data: JSON(personDetails),
//contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
'@Url.Action("Index", "Home")';
},
error: function (result) {
alert("A problem occured when submitting the form.");
}
});
return false;
});
Le Javascript est conçu pour se déclencher lorsque le bouton Soumettre est touché. D'abord, la méthode 'submitForm' dans le 'HomeController' est lancée, avant de revenir à 'Index' également dans le 'HomeController', qui affiche simplement une vue.
Le « submitForm » ressemble actuellement les suivantes:
[HttpPost]
public ActionResult submitForm(JsonResult jsonForm)
{
System.Diagnostics.Debug.WriteLine("made it here");
System.Diagnostics.Debug.WriteLine(jsonForm);
return View();
}
Donc, ma question est la suivante: qu'est-ce que je manque à la forme actuelle pour faire le feu de l'événement AJAX? Je suis à peu près sûr qu'il n'est pas en train de se déclencher car il n'y a pas d'alerte et il n'y a pas de sortie sur la console à cause de la méthode qu'elle est censée toucher.
Je préfère ne pas trop changer le formulaire lui-même car j'ai actuellement un autre bit de Javascript qui définit les cases à cocher onload le cas échéant.
EDIT: J'ai corrigé la méthode avec les conseils de Stephen Muecke. Ce que j'essaye de faire ici est: bouton de clic -> soumettre des détails à ma méthode de submitForm -> la méthode de submitForm prend des détails et fait quelques trucs dans la base de données -> renvoient le succès quand fini -> en cas de succès, redirigé de personDetails.cshtml à index.cshtml.
'succès: function (résultat) { '@ Url.Action ("Index", "Home")'; } 'ne fait rien. Est-ce une faute de frappe? Avez-vous vérifié votre onglet réseau pour voir si l'appel ajax est en cours et ce qu'il y a dans le corps de la réponse? Ce serait le moyen le plus simple de voir. Aussi, pourquoi votre méthode ajax accepte-t-elle un objet "JsonResult"? Cela devrait être le type _return_. Il devrait _accept_ un objet viewmodel correspondant aux champs du formulaire. – ADyson
Et vous ne devriez pas retourner une vue entière d'une méthode ajax - cela retournera une page HTML entière avec toutes les balises - vous ne pouvez pas insérer cela dans votre page. Vous devez soit renvoyer des données JSON (à l'aide d'un JsonResult), soit une vue partielle. – ADyson
Enfin, plutôt que de faire 'return false;' à la fin de votre méthode submit, il est plus sûr de mettre 'e.preventDefault();' comme première ligne de la méthode. Cela garantit qu'il n'y a aucune chance de faire une publication normale avant que le Javascript ait eu le temps de terminer. – ADyson