Getting Null from Ajax Post

本文关键字:Post Ajax from Null Getting | 更新日期: 2023-09-27 18:15:01

我正试图从我的web应用程序内部得到我的模型,进入post Action。唯一的问题是,我得到一个模型对象里面有1个空变量:()。动作是:

[HttpPost]
[ValidateAntiForgeryHeader]
public async Task<JsonResult> StartRound(RoundModel model)

模型如下:

编辑:感谢Nick Bailey,我开始发现以下编辑的成堆问题:

  • 删除了不需要的Round
  • 将匹配更改为列表,因为不确定模型构造器是否默认接口
  • 将OldId更改为int,因为这是它唯一的类型,Json对象将其作为int来执行
  • 操作
  • 将SystemId和AdminAprovedWinnerId更改为空,因为两者都可以为空
  • 未编辑所有的构造函数,我发现我没有默认构造函数因此没有办法构造它
  • 添加了如上所述的默认构造函数
public class RoundModel
{
    public List<ClientMatch> Matches { get; set; } // null in action
}
public class ClientMatch
{
    public int OldId { get; set; }
    public string RoundName { get; set; }
    public string ServerName { get; set; }
    public string ServerPassword { get; set; }
    public string ServerMessage { get; set; }
    public Guid? SystemId { get; set; }
    public Guid? AdminAprovedWinnerId { get; set; }
    public Guid TeamAId { get; set; }
    public Guid TeamBId { get; set; }
    public int TeamAVote { get; set; }
    public int TeamBVote { get; set; }
    public ClientMatch()
    {
    }
    public ClientMatch(MatchWithTmpId noGuid)
    {
        ...
    }
}

正如您将注意到的,Round对象是一个具有Virtual属性的Code First模型。在上传这个问题之前,我已经从RoundModel中删除了它来测试它,并且删除它并不能解决问题。

和我的Ajax post

编辑:感谢Nick Bailey,我开始发现以下编辑的成堆问题:

  • SystemId现在传递null,因为0不能解析为GUID
  • TeamAVote, TeamBVote都经过1(对应一个enum)
  • 目前我把它们嵌套在RoundModel中,因为这是我最后一次尝试让它工作
POST http://localhost:52690/Admin/StartRound HTTP/1.1
Host: localhost:52690
Connection: keep-alive
Content-Length: 752
Accept: */*
Origin: http://localhost:52690
X-Requested-With: XMLHttpRequest
__RequestVerificationToken: TU5lBruq0K0FBxviWOS1GVjtRFw0edbCvE57bzh3wikqlXTw384jgxGBic61nMgUNwAXRgbf50cpk0naKADQgwnR9aNq1R55SSHj6UvszBRdfJ8nt362OFBQLC7eWLTwAwPJUVkRrFQkCOnZwtL6SQ2
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:52690/Admin/MatchScheduler
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: redacted
{
   "RoundModel":{
      "Matches":[
         {
            "SystemId":null,
            "OldId":0,
            "RoundName":"awd",
            "ServerName":"Apogawd0",
            "ServerPassword":"apog",
            "ServerMessage":"Can Team '"Lovin it'" please create server '"Apogawd0'" hosted in Oceania Servers, random map",
            "AdminAprovedWinnerId":null,
            "TeamAId":"74206e93-33aa-48d4-bac2-5f9acac0be90",
            "TeamBId":"35d4be62-4e3e-4575-8ce9-6c819382b50c",
            "TeamAVote":1,
            "TeamBVote":1
         }
      ]
   }
}

任何和所有的帮助感谢,干杯,迈克尔。

编辑续:多亏Nick提醒了我一些基本的东西,我已经做了很多改变,哈哈,我在JS的土地上花了太多的时间。仍然得到null匹配

Getting Null from Ajax Post

为round参数传递一个空对象,所以它自然是null。TeamAVote和TeamBVote是客户端匹配模型上的不可空字段,因此序列化的Jason无法解析您发布的空值。我会让这些字段为空。

此外,对于API模型和数据模型使用不同的模型通常是一个非常好的主意。它们之间的差异很大,共享代码就成了问题。

最后一块拼图令人沮丧。我停止使用JSON作为表单数据,回到我的原始js对象,突然之间,成功了!我再次查看标题,确定是:Content-Type: application/x-www-form-urlencoded; charset=UTF-8于是我进入Ajax方法,添加:contentType: "application/json"

成功,谢谢Nick Bailey,是你让我走上了正确的道路,所以我将把答案授予你。

请编辑你的问题,以表明完整的答案在我的答案中,或者只是更新你的问题,包括解决方案。

再次感谢!