ASP.Net Core 6 API 成功后获取空值 Post a JSON

ASP.Net Core 6 API Get Null Value after Successfully Post a JSON

我刚刚学习了 MS ASP.NET Core Web API 教程,但遇到了一些问题。 在创建了一个API并且可以成功POST一个json格式字符串到这个API之后,我想定制它的应用程序。

TodoItem 不仅包含原始属性,还包含项目列表。

public class TodoItem
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
    public List<Item> TestArray { get; set; }
    public string? Secret { get; set; }
}

public class Item
{
    public long Id { get; set; }
    public string? Path { get; set; }
}

public class TodoItemDTO
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
    public List<Item> TestArray { get; set; }
}

这是我的控制器的 POST 和 GET 操作

[HttpPost]
public async Task<ActionResult<TodoItemDTO>> PostTodoItem(TodoItemDTO todoItemDTO)
{
    var todoItem = new TodoItem
    {
        IsComplete = todoItemDTO.IsComplete,
        Name = todoItemDTO.Name,
        TestArray = todoItemDTO.TestArray
    };

    _context.TodoItems.Add(todoItem);
    await _context.SaveChangesAsync();
    //return CreatedAtAction("GetTodoItem", new { id = todoItem.Id }, todoItem);
    return CreatedAtAction(
        nameof(GetTodoItem), 
        new { id = todoItem.Id }, 
        ItemToDTO(todoItem));
}
        
[HttpGet]
public async Task<ActionResult<IEnumerable<TodoItemDTO>>> GetTodoItems()
{
    return await _context.TodoItems.Select(x => ItemToDTO(x)).ToListAsync();
}

private static TodoItemDTO ItemToDTO(TodoItem todoItem) =>
    new TodoItemDTO
    {
        Id = todoItem.Id,
        Name = todoItem.Name,
        IsComplete = todoItem.IsComplete,
        TestArray = todoItem.TestArray
    };

POST 请求可以成功运行,但是,每当我向本地主机发送 GET 请求时,我总是收到一个空的 TestArray。但是其他属性还可以! 我不确定 JSON 内容是否成功存储到数据库中,是否有错误?

POST 回应

HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Date: Thu, 20 Jan 2022 09:22:20 GMT
Location: https://localhost:7261/api/TodoItems/1
Server: Kestrel
Transfer-Encoding: chunked

{
  "id": 1,
  "name": "walk dog",
  "isComplete": true,
  "testArray": [
    {
      "id": 1,
      "path": "a"
    },
    {
      "id": 2,
      "path": "c"
    }
  ]
}

获取响应

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 20 Jan 2022 09:22:23 GMT
Server: Kestrel
Transfer-Encoding: chunked

[
  {
    "id": 1,
    "name": "walk dog",
    "isComplete": true,
    "testArray": null
  }
]

正如@Peter Csala 提到的,我可以成功地 GET 完成 Json 结果,只需在 TodoItems 之后添加 Include 方法,如下所示。 TodoItems.Include(ti => ti. TestArray).Select(x => ItemToDTO(x))