【问题标题】:Ajax call data is not being passed to the controller during a POSTAjax 调用数据在 POST 期间未传递给控制器
【发布时间】:2021-11-07 02:03:02
【问题描述】:

背景:我有一个 jQuery Kendo 数据网格,允许用户在其中执行批量更新功能。我试图通过 jQuery 中的 AJAX 调用来调用我的控制器。我面临的问题是我的模型永远不会传递给控制器​​方法。当我的断点在 Controller 上命中时,MyModel 项目的计数为 0。尽管我可以在 Fiddler 请求正文中看到我的模型,但它实际上从未到达控制器。当我直接通过 Fiddler 访问 API 时,即使我传入应用程序生成的同一模型,也不会出现此问题。我错过了什么?我的 AJAX 请求有问题。

以下是我的控制器代码:

 [HttpPost]
    [Route("UpdateRequest")]
    [ResponseType(typeof(List<MyModel>))]
    public HttpResponseMessage UpdateRequest([FromBody] List<MyModel> items)
    {
        var p = new GridItemProcessor();
        var r = p.UpdateRows(items);
        return Request.CreateResponse(HttpStatusCode.OK, r);
    }

下面是我的 ajax 调用代码:

$.ajax({
                    type: "POST", async: false, url: baseAPIURL + "MrrRequest/UpdateRequest",
                    timeout: 15000,
                    dataType: 'json',
                    cache: false,
                    data: {
                        items: JSON.stringify(options.data.models)
                    },
                    success: function (result) {
                        options.success(result);
                        return true;
                    },
                    complete: function (data) {

                        $("#myGrid").data("kendoGrid").dataSource.read();

                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        alert(textStatus);
                        options.error();
                    }
                });

下面是我的 json 请求的样子

   [
  {
    "RequestId": 40,
    "beneClaimId": 32,
    "claimId": "20211308068186",
    "lineCnt": "1",
    "medRecRequested": true,
    "eobChk": true,
    "clmChk": true,
    "dateReceived": null,
    "MedRecRcvd": {
      "MedRecRcvdId": "I",
      "MedRecRcvdName": "Incomplete"
    }
  }
]

下面是 MyModel 的样子

 public class MyModel
{
    public int RequestId { get; set; }
    public int beneClaimId { get; set; }
    public string claimId { get; set; }
    public string lineCnt { get; set; }
    public bool? medRecRequested { get; set; }
    public bool? eobChk { get; set; }
    public bool? clmChk { get; set; }
    public string dateReceived { get; set; }
    public ViewModel.MedRecRcvd MedRecRcvd { get; set; } = new MedRecRcvd();
}

   public class MedRecRcvd
    {
        public string MedRecRcvdId { get; set; }
        public string MedRecRcvdName { get; set; }
    }

【问题讨论】:

  • 您发送了一个字符串列表data: { items: JSON.stringify(options.data.models) },,但您的控制器需要一个对象列表。
  • 我如何发送对象列表呢?起飞 JSON.stringify ? @ChristophLütjen
  • 使用以下语法数据:JSON.stringify(options.data.models)
  • @RahulShukla 我试过了,但控制器中的项目计数仍然返回为 0
  • 这应该适用于数据:'{items' + JSON.stringify(options.data.models) + '}', contentType: "application/json; charset=utf-8",跨度>

标签: c# jquery ajax kendo-ui kendo-grid


【解决方案1】:

您的控制器需要一个 MyModel 集合。因此,您需要发布一系列项目。通过使用 stringify 您正在发布单个字符串。作为测试,如果您将控制器更改为接受“字符串项目”,您应该在控制器中获得一个值。

假设您的 options.data.models 是一个数组,您将发布:

items: options.data.models

该数组中每个项目的属性需要与服务器上 MyModel 上的属性相匹配。如果是这种情况,您发布的数据应该在控制器中实现。

【讨论】:

  • 嗨@NigelK 感谢您的回复。我用我的 json 请求和 C# Mymodel 更新了这个问题。我认为我的问题出在控制器代码中的某个地方,控制器需要 List 项目,而我正在发送 json 对象列表。我猜测 Controller 需要以某种方式接受 json 对象,然后将 json 对象转换(序列化?) MyModel ?
  • 模型绑定器将发布的数据转换/反序列化为控制器中指定的对象。这都是 MVC 框架的一部分。您发布的数据在属性名称周围有引号,例如 "RequestId": 40。我认为它应该是 RequestId: 40 ?
猜你喜欢
  • 2020-09-17
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多