2017-05-11 1 views
1

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.

+2

'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

+2

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

+0

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

Répondre

1

Exemple:

Modèle:

public class MyModel{ 
     public string Id {get;set;} 
     public string Authorised {get;set;} 
     public string Enabled {get;set;} 
    } 

Action:

[HttpPost] 
     public ActionResult submitForm(MyModel model) 
     { 
      System.Diagnostics.Debug.WriteLine("made it here"); 
      System.Diagnostics.Debug.WriteLine(jsonForm); 
      return View(); 
     } 

Script:

$('#userUpdateForm').submit(function (e) { 
     var personDetails = { 
      Id: $('#idCheck').val(), 
      Authorised: $('#authCheck').val(), 
      Enabled: $('#eCheck').val() 
     }; 

     $.ajax({ 
      type: "POST", 
      url: '@Url.Action("submitForm", "Home")', 
      contentType: "application/json", 
      data: JSON.stringify({ model: personDetails }) 
      success: function (result) { 
       window.location.href = "/home/index/";    
      }, 
      error: function (result) { 
       alert("A problem occured when submitting the form."); 
      } 
     }); 

     return false; 
    }); 
2

Vous devez créer une autre classe qui doit contenir toutes les propriétés que vous sont en train de poster sur la méthode d'action submitForm.

Actuellement, vous utilisez la classe JsonResult qui ne contient pas les propriétés que vous essayez de publier, donc ici, ModelBinder ne liera pas les données. référence Model Binder articles ..Great ... love it ....

public class personDetails { 
     public string Enabled {get;set;} 
     public string Authorised {get;set;} 
     public string Id {get;set;} 
    } 
[HttpPost] 
     public ActionResult submitForm(personDetails ObjpersonDetails) 
     { 
      System.Diagnostics.Debug.WriteLine("made it here"); 
      System.Diagnostics.Debug.WriteLine(jsonForm); 
      return View(); 
     }