C# MVC5 WebApi 2创建未从正文中获取值([FromBody])

C# MVC5 WebApi 2创建未从正文中获取值([FromBody]),c#,asp.net-mvc,asp.net-web-api2,C#,Asp.net Mvc,Asp.net Web Api2,我创建了一个简单的CreateWebAPI2操作,该操作将从帖子主体获取一个对象,然后将其设置到DAL层。然而,无论我如何使用postman将对象放入方法中,它始终保持为null 模型如下所示: namespace WebApi.Models { using System; using System.Collections.Generic; public partial class Classes { public int Id { get; s

我创建了一个简单的CreateWebAPI2操作,该操作将从帖子主体获取一个对象,然后将其设置到DAL层。然而,无论我如何使用postman将对象放入方法中,它始终保持为null

模型如下所示:

namespace WebApi.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Classes
    {
        public int Id { get; set; }
        public string ClassName { get; set; }
        public int MaxStudents { get; set; }
    }
}
我的控制器如下:

[HttpPost]
public IHttpActionResult CreateClass([FromBody] Classes classObj)
{
    if (classObj == null)
    {
        return BadRequest("missing parameters.");
    }

    var newClass = new Classes()
    {
        ClassName = classObj.ClassName,
        MaxStudents = classObj.MaxStudents
    };

    _context.Classes.Add(newClass);
    _context.SaveChanges();

    var newClassUrl = Url.Content("~/") + "/api/classes/";

    return Created(newClassUrl, newClass);
}
现在,当我使用邮递员时,我尝试了两种选择

备选案文1:

URL: http://localhost:53308/api/classes/
Headers: Content-Type: applications/json

[
  "classObj":  {
       ClassName = "test"
       MaxStudents = 100
  }
]
备选案文2:

URL: http://localhost:53308/api/classes/
Headers: Content-Type: applications/json

       ClassName = "test"
       MaxStudents = 100
但在这两种情况下,
classObj
都保持为空,并返回“缺少的参数”。很明显,我在这里遗漏了一些东西


我做错了什么?

您的有效负载与操作预期不符

比如说

[HttpPost]
public IHttpActionResult CreateClass([FromBody] Classes classObj) {
    //...
}
应该是这样的JSON数据

{
    "ClassName": "test"
    "MaxStudents": 100
}
此外,如果发布到操作中的模型与添加到存储中的模型是相同的类型,那么实际上不需要创建新实例

[HttpPost]
public IHttpActionResult CreateClass([FromBody] Classes classObj) {
    if (classObj == null) {
        return BadRequest("missing parameters.");
    }

    _context.Classes.Add(classObj);
    _context.SaveChanges();

    var newClassUrl = Url.Content("~/") + "/api/classes/" + classObj.Id.ToSTring();

    return Created(newClassUrl, classObj);
}

这很有效,我想我认为使用完整对象太复杂了。不过,关于DTO,我还有另一个问题。我将使用它将其返回给使用者,使用Dto而不是原始类不是更好吗(尽管这里的Dto与实际模型相同,但情况并非总是如此)?再次感谢您的回答。@Rodneywormbecher,应该使用DTO。在您的示例中,您没有使用DTO,因此我建议不要重新创建同一对象。