【问题标题】:ASP.NET Core Posting Array Object JSONASP.NET Core 发布数组对象 JSON
【发布时间】:2018-05-23 17:25:58
【问题描述】:

我正在尝试将视图中的 Object 数组发布到我的控制器,但 params 为 null 我发现对于一个简单的对象,我需要将 [FromBody] 放入我的控制器操作中。

这是我的 JSON:

{
  "monJour": [
    {
      "openTime": "04:00",
      "closedTime": "21:30",
      "id": "0"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "1"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "2"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "3"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "4"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "5"
    },
    {
      "openTime": "08:00",
      "closedTime": "17:30",
      "id": "6"
    }
  ]
}

这是我的 Ajax 请求:

function SendAllDay() {
    var mesJours = {};
    var monJour = [];
    mesJours.monJour = monJour;

    var senddata ='';

    $('div[id^="Conteneur"]').each(function () {
        var idDiv = $(this).attr("id");
        var jour = idDiv.substr(9, idDiv.length - 9);
        var opentps = $("#O" + jour).val();
        var closetps = $("#C" + jour).val();
        var monid = $("#id" + jour).val();

        monJour = {
            openTime: opentps,
            closedTime: closetps,
            id: monid
        }

        mesJours.monJour.push(monJour);
    });

    $.ajax({
        url: '@Url.Action("ReceiveAll")',
        dataType: 'json',
        type: 'POST',
        //data: JSON.stringify(monJours),
        data: JSON.stringify(mesJours),
        contentType:'application/json',
        success: function (response) {
            console.log('ok');
            //window.location.reload();
        },
        error: function (response) {
            console.log('error');
            //alert(response)
            //window.location.reload();
        }
    });
}

这是我的操作:

[HttpPost]
public void ReceiveAll([FromBody]ReceiveTime [] rt) { }

这是我的班级:

public class ReceiveTime
{
    public string openTime { get; set; }
    public string closedTime { get; set; }
    public string id { get; set; }
}

任何帮助表示赞赏:)

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc model-binding


    【解决方案1】:

    ajax js请求中的名称需要与后端控制器的参数名称一致。

    尝试如下更新控制器中的方法签名:

    public void ReceiveAll([FromBody]ReceiveTime [] monJour)

    另外,即使我喜欢法语,我还是建议您使用英语来命名变量。无论如何请不要被冒犯,但真的很推荐。

    【讨论】:

    • 这是错误的。这是一个帖子,数据正在通过消息的 BODY 传递。没有参数名称是通过 AJAX 请求传递的。您可以随意命名 [FromBody] 参数,它会绑定正文中的数据。
    【解决方案2】:

    与其使用ReceiveTime[] rt,不如根据您发布的相同结构对数据进行建模可能会更好。例如,您可以创建一个如下所示的类:

    public class MesJours
    {
        public ReceiveTime[] MonJour { get; set; }
    }
    

    我不知道 MesJours 作为班级名称是否有意义(我不会说法语),但想法仍然很清楚 - 您可以随意命名班级。

    鉴于此,您可以像这样更新您的控制器:

    [HttpPost]
    public void ReceiveAll([FromBody] MesJours mesJours)
    {
        // Access monJour via mesJours.
        var rt = mesJours.MonJour;
    }
    

    这将满足 ASP.NET MVC 模型绑定器,并且应该为您提供您已发布的数据。这还有一个额外的好处,即可以轻松容纳您可能想要发布的任何其他属性。

    【讨论】:

      【解决方案3】:

      1.添加一个类,Mesjours:

      public class MesJours
      {
          public ReceiveTime[] MonJour { get; set; }
      }   
      

      2.在控制器操作中将返回类型更改为异步任务(对于 aspnetcore)

      [HttpPost]
      public async Task<IActionResult> ReceiveAll([FromBody]MesJours mesJourData)
      {
          var rt = mesJourData.MonJour;
      }
      

      3.在视图中,确保发布的数据与控制器操作中的参数名称相同(在本例中为 mesJourData)。注意ajax方法中包含数据参数的行的语法

      $.ajax({
              url: '@Url.Action("ReceiveAll")',
              dataType: 'json',
              type: 'POST',
              data:{mesJourData: mesJours} ,
              contentType:'application/json',
              success: function (response) {
                  console.log('ok');
                  //window.location.reload();
              },
              error: function (response) {
                  console.log('error');
                  //alert(response)
                  //window.location.reload();
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 2020-12-03
        • 1970-01-01
        • 2016-09-16
        • 2019-04-01
        • 2017-10-31
        • 1970-01-01
        • 2014-05-28
        • 2018-11-11
        相关资源
        最近更新 更多