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以上是关于Ajax 调用数据在 POST 期间未传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章
将 KnockoutJS 可观察数组传递给 HTTP Post 控制器方法的 AJax 调用失败
JSON 数据未传递给控制器操作并给出 POST 500 内部服务器错误