Ajax Post将null传递给Controller

时间:2019-06-20 08:15:55

标签: c# jquery ajax asp.net-mvc model-view-controller

我正在向MVC控制器发出AJAX POST请求,但数据以null的形式通过。我不确定为什么。

$(document).ready(function() {
  $("#btnSaveCustomer").click(function() {
    debugger; 
    var data = {
      _DcLink: "1",
      _Account: "Test",
      _Name: "TestName",
      _Title: "Mr",   
      _Init: "T"
    }

    $.ajax({
      method: "POST",
      url: '/Customer/SaveCustomer',
      data: JSON.stringify(data),
      success: function() {
        debugger;
        console.log(data)
        alert("Success")
      },
      error: function() {
        alert("Error")
      }
    });
})
public ActionResult SaveCustomer(string data)
{
  using (var ms = new MemoryStream(Encoding.UTF32.GetBytes(data)))
  {
    // Deserialization from JSON  
    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(Customer));
    Customer serializeddata = (Customer)deserializer.ReadObject(ms);
  }
  return Json(new { Success = true });
}

无论我如何尝试序列化数据,始终都是null。我相信AJAX POST方法执行不正确

我正在使用虚拟数据来解决问题。

代码在控制器中的MemoryStream处遇到一个断点-声明数据为null

  

System.ArgumentNullException:'未将字符串引用设置为String的实例。   参数名称:s'

任何帮助表示赞赏

4 个答案:

答案 0 :(得分:3)

这是因为ModelBinder期望在JSON中命名为data的属性,但您并未发送该属性;所有属性都在根对象中。如果您要绑定到模型,那会很好用,但是由于您不需要,所以需要稍微修改JS中的数据结构,以达到以下目的:

var data = { 
  data: {
    _DcLink: "1",
    _Account: "Test",
    _Name: "TestName",
    _Title: "Mr",   
    _Init: "T"
  }
}

答案 1 :(得分:1)

像这样改变;

data: {data : JSON.stringify(data)},

答案 2 :(得分:0)

有相同的问题。 AJAX调用失败。如果我从控制器中删除[FromBody],则ajax调用成功,但是数据为空。我正在使用.NET Core 3.1和剃须刀页面

 <script>
      $(document).ready(function () {
        var data = { "name": "John Doe" }
        $.ajax({
            url: "/membership/tester/",
            type: "POST",
            data: JSON.stringify(data),
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            headers: {
                RequestVerificationToken: 
                $('input:hidden[name="__RequestVerificationToken"]').val()
            },
            success: function (data) {
                alert('Survey submitted successfully');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                if (jqXHR.status == 500) {
                    alert('Internal error: ' + jqXHR.responseText);
                } else {
                    alert('Unexpected error.' + jqXHR.status);
                  }
               }
          });
       });
    </script>

这是控制器代码

[Route("membership/tester")]
[HttpPost]
public ActionResult Test([FromBody] string somedata)
{
    var data = somedata;
    return Json(data);
}

答案 3 :(得分:-2)

$(document).ready(function() {
  $("#btnSaveCustomer").click(function() {
    debugger;
    var data = {
      _DcLink: "1",
      _Account: "Test",
      _Name: "TestName",
      _Title: "Mr",
      _Init: "T"
    }

    $.ajax({
      method: "POST",
      url: '/Customer/SaveCustomer',
      data: JSON.stringify(data),
      success: function(data) {
        debugger;
        console.log(data)
        alert("Success")
      },
      error: function() {
        alert("Error")
      }
    });
  })