MVC5 WebApi 2创建没有从身体获得价值([FromBody])

问题描述:

我创建了一个简单的创建Web API 2操作,它将从帖子主体中获取一个对象,然后将其设置为DAL层。然而,无论我使用邮递员将对象放入方法中,它始终保持为空。MVC5 WebApi 2创建没有从身体获得价值([FromBody])

这个模型看起来是这样的:

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) { 
    //... 
} 

会认为像这样

{ 
    "ClassName": "test" 
    "MaxStudents": 100 
} 

也因为贴到行动的模型是同类型添加到存储在那里是不是真的JSON数据需要创建一个新的实例。

[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); 
} 
+0

那么工作,我想我正在考虑使用完整的对象太复杂。不过,我确实有另一个关于DTO的问题。我会用它将它返回给消费者,那么使用Dto代替原始类会不会更好?(尽管dto与实际模型相同,但情况并非总是如此)?再次感谢您的回答。 –

+1

@RodneyWormsbecher,使用DTO是应该如何完成的。在你的例子中,你没有使用DTO,因此我建议不要重新创建同一个对象。 – Nkosi