Ajax 调用数据在 POST 期间未传递给控制器

Posted

技术标签:

【中文标题】Ajax 调用数据在 POST 期间未传递给控制器【英文标题】:Ajax call data is not being passed to the controller during a 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",跨度> 【参考方案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 ?

以上是关于Ajax 调用数据在 POST 期间未传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败

通过 AJAX 调用将 JSON 对象列表传递给控制器

JSON 数据未传递给控制器​​操作并给出 POST 500 内部服务器错误

Rails.ajax 数据未传递给控制器

确保控制器方法实际上是由 ajax 或 mvc 中的 POST 请求调用的

在 jquery 的 post 中传递参数