2016-03-11 5 views
0

Я не могу понять, почему мой параметр действия идет через нуль. Я также не уверен, как даже диагностировать проблему. Я могу видеть, что данные запроса HTTP, отправляемые с данными, и переход через отладчик показывает объект как null, не уверен, как видеть шаги между ними.Диагностика проблемы с связующим JS-моделью в mvc из ajax

Модели

public class ComplexObj 
    { 
     public int Id { get; set; } 
     public int Test1 { get; set; } 
     public decimal Test2 { get; set; } 
    } 

    public class BiggerObj 
    { 
     public BiggerObj() 
     { 
      ComplexObj = new List<ComplexObj>(); 
     } 

     public long OtherId { get; set; } 
     public string Name { get; set; } 
     public ICollection<ComplexObj> ComplexObjs { get; set; } 
    } 

Действие

[HttpPost] 
    public void TestAction(BiggerObj[] biggerObjs) 
    { 
     ...// biggerObjs is null :(
    } 

Посмотреть

function ajaxCall() { 
     var data = []; 

       var bigObj = new Object(); 
       bigObj.OtherId = 123; 
       bigObj.Name = "TestName"; 
       bigObj.ComplexObj = []; 

       var complexObj = new Object(); 
       complexObj.Id = 789; 
       complexObj.Test1 = 123; 
       complexObj.Test2 = 456; 

       bigObj.ComplexObj.push(complexObj); 

       data.push(bigObj); 
      } 
     } 

     $.ajax({ 
      url: SITEROOT + "myController/TestAction", 
      cache: false, 
      type: 'POST', 
      data: data, 
      complete: function() { 
       alert('done'); 
      } 
     }); 
    } 

ответ

1

решаемые

Вы должны использовать:

  • JSON.stringify и объявить contentType, как "application/json; charset=utf-8"

  • Синтаксический десятичное значение с помощью parseFloat() function, десятичной считается по умолчанию Int связующем.

Изменить свое действие на это:

[HttpPost] 
     public ActionResult TestAction(BiggerObj[] biggerObjs) 
     {    
      ...// biggerObjs is null :(
     } 

Измените функцию ajaxCall на это:

//ajaxCall 
function ajaxCall() { 
     var data = []; 

     var bigObj = { 
      OtherId : 123, 
      Name : "TestName", 
      ComplexObjs : new Array() 
     }; 

     var ComplexObjs = { 
      Id: 789, 
      Test1: 123, 
      Test2: parseFloat(456) 
// decimal types are considered an integer, you have to parse 
     }; 

     bigObj.ComplexObjs.push(ComplexObjs); 

     data.push(bigObj); 


     $.ajax({ 
      url:"/Test/TestAction", 
      cache: false, 
      type: 'POST', 
      data: JSON.stringify(data), 
      contentType: "application/json; charset=utf-8", 
      complete: function() { 
       alert('done'); 
      } 
     }); 
    } 

Я проверил, работает отлично.

+0

Работал как чемпион, спасибо большое! – user3953989

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