2016-11-18 1 views
0

Я планирую использовать ajax-вызов из jquery для отправки данных в контроллер MVC. Я хочу передать строку json-объектов с помощью JSON.stringify() в контроллер, но я постоянно получаю 400-й запрос. Является ли это плохой практикой отправки строки json объекта? или я должен использовать viewmodel?плохой запрос для jquery Ajax для отправки строковых json-данных в действие MVC

My Action в MVC, как показано ниже, принимает строковое значение в качестве параметра.

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

     .. do some actions here ... 

     return View("Customer"); 
    } 

Мой звонок Ajax, как показано ниже.

$("#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 
       } 
      }); 
     }); 

и вот образец строковых значений формы.

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

Попробуйте удалить ' ValidateAntiForgeryToken' из вашего 'ActionMeth od' и 'param' не является' string', который передается через 'ajax'. Попробуйте получить его как пары ключевых значений или определить его как класс пары ключей. –

ответ

0

Вы можете использовать это:

$.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 
       } 
      }); 

и сериализовать его в контроллер, чтобы связать его с моделью:

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

где ValuesModel является

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

Спасибо .. Это действительно хорошая идея. Не могли бы вы помочь мне определить, как выглядит метод действий? Я попытался с вышеуказанным кодом, но все еще получаю плохой запрос. – superted

+0

вам нужно использовать 'публичных асинхронной Task Создать (строковые значения)' и 'удалить ValidateAntiForgeryToken' – RonyLoud

+0

Вы также можете использовать' [HttpPost] общественных асинхронной Task Создать (список значения) { // сделать что-то *** return View («Клиент»); } ' – RonyLoud

Смежные вопросы