2016-11-18 1 views
0

Je prévois d'utiliser l'appel ajax de jquery pour publier des données au contrôleur MVC. Je veux passer la chaîne d'objets json en utilisant JSON.stringify() au contrôleur mais je reçois continuellement la mauvaise requête 400. Est-ce une mauvaise pratique d'envoyer un objet string json? ou dois-je utiliser le viewmodel?mauvaise demande pour jquery Ajax de publier des données json stringifiées à l'action MVC

Mon action dans MVC est comme ci-dessous en acceptant la valeur de chaîne en tant que paramètre.

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Create(string values) 
    { 

     .. do some actions here ... 

     return View("Customer"); 
    } 

Mon appel Ajax est comme ci-dessous.

$("#customer-add-btn").click(function() { 

      var data = $('#customer-add-form').serializeArray(); 
      console.log(data); 

      var values = JSON.stringify(data); 

      console.log(values); 


      $.ajax({ 
       url: 'Customer/Create', 
       data: values, 
       type: "POST", 
       dataType: "json", 
       data: values, 
       success: function (result) { 
        console.log('success');// do something on success 
       }, 
       error: function() { 
        console.log('error');// do something on error 
       } 
      }); 
     }); 

et voici l'exemple de valeurs de forme stringifiées.

[ {"name":"business_name","value":"adsf"},{"name":"business_phone_number","value":"124"},{"name":"business_contact_number","value":""} ] 
+0

Essayez de supprimer ' ValiderAntiForgeryToken' depuis votre 'ActionMeth od' et 'param' ne sont pas' string' qui est passé par 'ajax'. Essayez de le recevoir en tant que paires de valeurs clés ou définissez-le comme classe de paire de valeur clé .. –

Répondre

0

Vous pouvez utiliser ceci:

$.ajax({ 
       type: "POST", 
       url: '@Html.Raw(Url.Action("Create", "Customer"))', 
       data: { values: JSON.stringify(values) }, 
       dataType: "json", 
       success: function (result) { 
        console.log('success');// do something on success 
       }, 
       error: function() { 
        console.log('error');// do something on error 
       } 
      }); 

et sérialiser dans le contrôleur pour le lier avec le modèle:

var model = new List<ValuesModel>(); 
       //JavaScript Serializer to bind with Model 
       JavaScriptSerializer jsSerializer = new JavaScriptSerializer(new SimpleTypeResolver()); 
       model = jsSerializer.Deserialize<List<ValuesModel>>(values); 

ValuesModel est

public class ValuesModel 
    { 
     public ValuesModel() 
     { 
     } 
     public string name { get; set; } 
     public string values { get; set; } 
    } 
+0

Merci .. C'est vraiment une bonne idée. Pouvez-vous s'il vous plaît m'aider à définir à quoi ressemble la méthode d'action? J'ai essayé avec le code ci-dessus mais toujours obtenir la mauvaise demande. – superted

+0

vous devez utiliser 'publique async Tâche Créer (valeurs de chaîne)' 'et enlever ValidateAntiForgeryToken' – RonyLoud

+0

Vous pouvez également utiliser' [HttpPost] publique async Tâche Créer (Liste valeurs) { // faire quelque chose *** return View ("Customer"); } ' – RonyLoud