2017-01-23 3 views
2

EDIT an die Steuerung: Vielen Dank für diese Fehler Ash fangen gab es drei Probleme hierMVC Pass json Daten

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 

Ich versuche, einige JSON-Daten an eine Steuerung zu übergeben. Wann immer ich eine js Object an die Controller übergeben, ist mein Modell null. Sollte das nicht der Standard-Modellbinder erledigen? Ich kann nicht herausfinden, warum ich null bekomme, wenn ich Daten an den Controller übergebe. Ich habe mir andere SO-Fragen angeschaut, aber keine hat bisher geholfen.

Die Daten sieht wie folgt aus

{ 
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 
} 

Diese sind, was sehen meine DTO wie

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; } 
} 

Mein Controller wie diese

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

Mein JS Code

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); 
    }); 
} 
sieht Hier

ist, was mein Ajax-Request sieht aus wie

//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

Ihr Controller BetterJsonResult gibt null zurück, weshalb Ihr Objekt nicht ausgefüllt ist, zurück ganttDataModel – Fuzzybear

+0

@Fuzzybear Sorry, aber das ist es nicht, es gibt noch nichts zurück, deshalb setze ich null. Das 'ganttDataModel' ist' null', egal was ich zurückgebe. –

+0

@Ash Warum sollte ich das tun? –

Antwort

1

Hier ist die Lösung für Ihr Problem.

Zwei Dinge hier:

  1. Ich gehe davon aus den JSON Beispieldaten Sie reine Hand zugeschnitten vorgesehen sind, aber zu erwähnen noch, dass die Daten paar Tippfehler sind mit.

    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. Sie haben die Datenelemente nicht als Eigenschaften für Getter und Setter markiert.

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

versuchen Nun und lassen Sie mich wissen, ob es für Sie arbeitet oder nicht.

+1

Guter Gott! Netter Fang. Ich habe die Getter und Setter vergessen Und mein Eigentum wurde falsch geschrieben. 'öffentliche Zeichenfolge Test {get; einstellen; } 'anstelle von 'public string Text {get; einstellen; } 'sowie die' JSON'-Daten sind zu groß, um serialisiert zu werden. –