提问人:Pakshirajan 提问时间:11/7/2023 最后编辑:Pakshirajan 更新时间:11/7/2023 访问量:83
对控制器的 AJAX POST 调用传递 NULL
AJAX POST call to a controller is passing NULL
问:
从视图呼叫
$.ajax({
url: _urls.saveNoteDetailsUrl,
type: "POST",
cache: false,
contentType: "application/json",
data: JSON.stringify(inputModel),
success: function (response) {
window.location.assign(_urls.ReturnToHomePageUrl);
}
控制器
方法 1
[HttpPost] public IActionResult SaveNote(PNoteRequest model)
方法 2
[HttpPost] public IActionResult SaveNote([FromBody] PNoteRequest model)
Approach1 获取一个模型,但值均为 null Approach2 为模型本身传递 NULL。
相同的端点是从另一个视图调用的,如果我使用 approach1,则会产生相同的错误,但如果我使用 Approach2,它可以正常工作。inputModel 结构略有不同:与工作调用相比,非工作调用中存在一些额外的键值对。我已确保所有键都存在于 ViewModel 中。
如果我进行以下更改,则来自两个视图的调用确实有效
- 传递 as 即放弃该方法。
inputModel
JSON.Stringify
- 删除 AJAX 调用中的参数
contentType
- 从控制器方法中删除标记
[FromBody]
但是数据是以 urlencoded 的形式传递的,当 inputModel 变得巨大时,这给了我另一个问题。因此,我需要以JSON格式传递数据,而不是urlencoded。
如何解决?
感谢您的回复。我想我没有正确解释这个问题。有 2 个视图对同一端点进行 AJAX POST 调用。如果传递的对象不是很大,一切都很好。如果对象很大,则它将模型的 NULL 传递给 CONTROLLER。为了解决上述问题,我进行了以下更改:1)将[FromBody]添加到CONTROLLER中,2)添加了contentType参数和JSON。Stringify() 添加到 VIEWS 中的 AJAX 调用。现在,从一个 VIEW 调用有效,但另一个无效。另一个调用将模型的 NULL 传递给 CONTROLLER
我正在尝试提供尽可能多的信息。2 个视图中的代码非常庞大,将屏幕中的值连接起来以构造 inputModel。我已经多次验证,AJAX 调用的区别仅在于 NoteInfo 键。
下面是 PNoteRequest 类文件。PNoteRequest 类中大约有 30 个其他属性。
public class PNoteRequest
{
public int RequestId { get; set; }
public NoteInfo NoteInfo { get; set; }
public string RequestText { get; set; }
public string RecordNo { get; set; }
}
NoteInfo 类中还有大约 20 个其他属性。
public class NoteInfo
{
public string Title { get; set; }
public string Description { get; set; }
public bool? IsSAR { get; set; }
public int MemoOverRideRecordNumber { get; set; }
public bool IsToReplaceSAR { get; set; }
public int? Region { get; set; }
public string QISNo { get; set; }
public string RevisionComments { get; set; }
}
来自 2 个视图的调用之间的差异在于 NotInfo 属性
请求有效的调用有效负载
{"RequestId":4062,
"NoteInfo":{"Title":"Save Note Check For Small JSON Object.",
"Description":"AJAX call for save NOTE and save SAR.",
"IsSAR":false}
}
请求暂停 NULL 的调用的有效负载
{"RequestId":0,
"NoteInfo":{"Title":"Save Note Check For Small JSON Object.",
"Description":"AJAX call for save NOTE and save SAR.",
"IsToReplaceSAR":false,
"MemoOverRideRecordNumber":"",
"RevisionComments":"",
"Region":"",
"QISNo":""}
}
答:
第二个 JSON 未通过验证,这就是它返回 null 的原因,例如此属性无效
"MemoOverRideRecordNumber":"",
"Region":"",
第一个是 int,第二个是 int?类型,所以应该是
"MemoOverRideRecordNumber":0,
"Region":null,
为了转换它们,您需要将属性类型更改为字符串或编写自定义 JSON 转换器
评论
JSON.stringify