【问题标题】:MVC pass json data to controllerMVC 将 json 数据传递给控制器
【发布时间】:2017-06-08 14:56:15
【问题描述】:

编辑:感谢您发现这些错误 Ash 这里有3个问题

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 时,我的模型为空。默认模型绑定器不应该处理这个吗?在将数据传递给控制器​​时,我不知道为什么我得到空值。我查看了其他 SO 问题,但到目前为止没有任何帮助。

数据是这样的

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

【问题讨论】:

  • 你的控制器 BetterJsonResult 返回 null 这就是你的对象没有被填充的原因,返回 ganttDataModel
  • @Fuzzybear 抱歉,不是这样,它还没有返回任何内容,这就是我设置 null 的原因。无论我返回什么,ganttDataModel 都是 null
  • @Ash 我为什么要这样做?

标签: javascript c# json http-post model-binding


【解决方案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. 您尚未使用 getter 和 setter 将数据成员标记为属性。

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

现在试试,让我知道它是否适合你。

【讨论】:

  • 天哪!不错的渔获。我忘记了 getter 和 setter 我的财产拼写错误。 ` 公共字符串测试 { 获取;放; }` 而不是 ` public string Text { get;放; }` 以及 JSON 数据太大而无法序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多