对控制器的 AJAX POST 调用传递 NULL

AJAX POST call to a controller is passing NULL

提问人:Pakshirajan 提问时间:11/7/2023 最后编辑:Pakshirajan 更新时间:11/7/2023 访问量:83

问:

从视图呼叫

$.ajax({
    url: _urls.saveNoteDetailsUrl,
    type: "POST",
    cache: false,
    contentType: "application/json",
    data: JSON.stringify(inputModel),
    success: function (response) {
       window.location.assign(_urls.ReturnToHomePageUrl);
    }

控制器

  1. 方法 1

    [HttpPost]
    public IActionResult SaveNote(PNoteRequest model)
    
  2. 方法 2

    [HttpPost]
    public IActionResult SaveNote([FromBody] PNoteRequest model)
    

Approach1 获取一个模型,但值均为 null Approach2 为模型本身传递 NULL。

相同的端点是从另一个视图调用的,如果我使用 approach1,则会产生相同的错误,但如果我使用 Approach2,它可以正常工作。inputModel 结构略有不同:与工作调用相比,非工作调用中存在一些额外的键值对。我已确保所有键都存在于 ViewModel 中。

如果我进行以下更改,则来自两个视图的调用确实有效

  1. 传递 as 即放弃该方法。inputModelJSON.Stringify
  2. 删除 AJAX 调用中的参数contentType
  3. 从控制器方法中删除标记[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":""}
}
JavaScript C# jQuery JSON AJAX

评论

0赞 Heretic Monkey 11/7/2023
如果您使用 Approach2 删除并保留其他所有内容(即,从列表中执行 #1 和仅执行 #1),则它不应对任何内容进行 URL 编码。JSON.stringify
0赞 GotStu 11/7/2023
请发布模型。我敢打赌这是一个案例问题。
1赞 Serge 11/7/2023
为了帮助您,您必须向我们展示 PNoteRequest 类和 inputmodel json。我们如何在不了解您发送的内容和期望的情况下为您提供帮助?

答:

0赞 Serge 11/7/2023 #1

第二个 JSON 未通过验证,这就是它返回 null 的原因,例如此属性无效

 "MemoOverRideRecordNumber":"",
 "Region":"",

第一个是 int,第二个是 int?类型,所以应该是

"MemoOverRideRecordNumber":0,
"Region":null,

为了转换它们,您需要将属性类型更改为字符串或编写自定义 JSON 转换器

评论

0赞 Pakshirajan 11/8/2023
谢谢。就是这样,我很惊讶,当模型在没有 JSONIFY 的情况下传递时,这不会导致错误。