2017-01-23 10 views
2

EDIT: Спасибо за поймать эти ошибки Ash Были 3 проблемы здесьMVC данных передачи JSON в контроллер

1. The JSON request was too large to be deserialized I had to add <add key="aspnet:MaxJsonDeserializerMembers" value="150000" /> in the app settings 
2. I forgot the getters and setters in one of my classes 
3. I misspelled one of my properties 

Я пытаюсь передать некоторые данные JSon к контроллеру. Когда я передаю js Object на Controller, моя модель имеет значение null. Не следует ли по умолчанию использовать это связующее устройство по умолчанию? Я не могу узнать, почему я получаю null при передаче данных контроллеру. Я посмотрел на другие вопросы, но до сих пор никто не помог.

Данные выглядит следующим образом

{ 
Data: [{ 
     duration: 5, 
     end_date: "06-04-2013 00:00" 
     id: 1, 
     open: true, 
     parent: 0, 
     progress: 0, 
     start_date: "01-04-2013 00:00", 
     text : "PcB ddCcgoMordiF Arr e" 
     }] 
Links: //empty array of something similar 
} 

Это то, что внешний вид моего DTO как

public class GanttRequestDto 
{ 
    public IEnumerable<GanttTaskDto> Data; 
    public IEnumerable<GanttLinkDto> Links; 
} 



public class GanttTaskDto 
    { 
     public int Id { get; set; } 
     public string Test { get; set; } 
     public DateTime Start_date { get; set; } 
     public DateTime End_date { get; set; } 
     public int Duration { get; set; } 
     public bool Open { get; set; } 
     public decimal Progress { get; set; } 
     public int? ParentId { get; set; } 
} 

public class GanttLinkDto 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public int Source { get; set; } 
    public int Target { get; set; } 
} 

Мой контроллер выглядит следующим образом

[HttpPost] 
public BetterJsonResult SaveGanttChartData(GanttRequestDto ganttDataModel) 
{ 
    //do something 
    return null; 
} 

Мой JS код

InitSaveButton() { 
    $("#save-btn").click(function() { 
     var ganttData = gantt.serialize(); 
     var model = { 
      Data: ganttData.data, 
      Links: ganttData.links 
     }; 
     Ajax.ajaxRequest(null, "/Gantt/SaveGanttChartData?ganttDataModel", model, null, "Saving Gantt Data", "Success", null); 
    }); 
} 

Вот что мой запрос Ajax выглядит

//url:string 
//model:json object 
//updateId (optional): area to update, 
//toastMessage: optional toast message 
//toasTitle: optional toast title 
//onComplete: optional callback function 
Ajax.ajaxRequest = function (httpVerb, url, model, updateId, toastMessage, toastTitle, onComplete) { 
    if (httpVerb === null || httpVerb.length === 0) httpVerb = "POST"; 
    $.ajax({ 
     url: url, 
     type: httpVerb, 
     cache: false, 
     data: JSON.stringify(model), 
     dataType: "json", 
     contentType: 'application/json; charset=utf-8' 
    }).done(function (data) { 
     Ajax.ajaxSuccess(data, updateId, toastMessage, toastTitle); 
    }).fail(function (err) { 
     Ajax.ajaxFailure(err); 
    }).always(function (data) { 
     if (onComplete && typeof onComplete === 'function') { 
      onComplete(data); 
     } 
    }); 
}; 
+0

Ваш контроллер BetterJsonResult возвращает null, поэтому ваш объект не заселен, return ganttDataModel – Fuzzybear

+0

@Fuzzybear Извините, но это не так, оно ничего не возвращает, поэтому я поместил null. 'GanttDataModel' является' null', независимо от того, что я возвращаю. –

+0

@Ash Зачем мне это делать? –

ответ

1

Вот исправление для вашего вопроса.

Две вещи здесь:

  1. Я предполагаю, что выборка данных JSON вы предоставили чисто ручной специально, но все-таки отметить, что данные, имеющие несколько опечаток.

    var data = { 
    Data: [{ 
         duration: 5, 
         end_date: "06-04-2013 00:00", 
         id: 1, 
         open: true, 
         parentId: 0, 
         progress: 0, 
         start_date: "01-04-2013 00:00", 
         test : "PcB ddCcgoMordiF Arr e" 
         }], 
    Links: [{Id : 1, Type: "sdsd"}] 
    } 
    
  2. Вы не пометили элементы данных как свойства с помощью геттеров и сеттеров.

    public class GanttRequestDto 
    { 
        public IEnumerable<GanttTaskDto> Data { get; set; } 
    
        public IEnumerable<GanttLinkDto> Links { get; set; } 
    } 
    

Ну попробуйте сейчас и дайте мне знать, если он работает для вас или нет.

+1

Господи! Хорошо поймал. Я забыл геттеры и сеттеры. И у меня была ошибка с ошибкой. 'public string Test {get; задавать; } 'вместо' public string Text {get; задавать; } ', а также данные' JSON', которые слишком велики для сериализации. –