【问题标题】:ASP.NET Core C# Web API POST/PUT relational dataASP.NET Core C# Web API POST/PUT 关系数据
【发布时间】:2017-11-14 06:36:54
【问题描述】:

我正在使用 ASP.NET Core 构建一个简单的娱乐应用,我目前只有一个 Post 模型和一个 User 模型。

Post.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Models
{
    public class Post
    {
        [Required]
        public int Id { get; set; }

        [Required]
        [MaxLength(16)]
        public string Title { get; set; }

        public string Body { get; set; }

        [Required]
        public Person Author { get; set; }
    }
}

Person.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Models
{
    public class Person
    {
        public int Id { get; set; }

        [Required]
        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }

        [Required]
        public string Email { get; set; }

        [Required]
        public string Password { get; set; }

        public ICollection<Post> Posts = new List<Post>();
    }
}

我使用 Visual Studio 的脚手架为这些模型生成控制器。 当我尝试POST /api/posts 以创建新帖子时,我还想为该帖子指定Author ID

我尝试添加属性authorId,我尝试了"authorId": 1"author": { "id": 1 },但由于需要作者,我总是返回Author is missingEmail in author is missing 等。

如何在帖子正文中包含 authorId 以便我能够成功创建新帖子?

【问题讨论】:

  • 能否请您在问题标题中总结您的问题,而不是用标签/关键字填充问题标题?花点时间阅读What are tags, and how should I use them?。一个好的标题可以总结您遇到的问题,帮助其他人发现您的问题,并仅从标题中查看他们是否有解决方案
  • 您正在编辑数据,因此请始终使用视图模型,并且该视图模型将不包含 Author 的属性,因为它不会被用户编辑。在 POST 方法中您初始化数据模型(如果编辑现有记录,则从数据库中获取)并根据视图模型设置其属性(并根据当前用户设置作者属性)What is ViewModel in MVC?

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

您的控制器将期待Author 属性的有效整个 Person 类(这意味着您必须提供Person 所需的所有属性) - 尝试更改您的 Post 类以仅包含 AuthorId 作为必填字段。您仍然可以将Author 包含为属性,只是不要将其设为必需。

public class Post
{
    [Required]
    public int Id { get; set; }

    [Required]
    [MaxLength(16)]
    public string Title { get; set; }

    public string Body { get; set; }

    [Required]
    public int AuthorId { get; set; }

    public Person Author { get; set; }
}

【讨论】:

    【解决方案2】:

    我不确定你当前的控制器方法是什么,因为你还没有在这里发布来看看有什么问题,但是为了给你一个大致的想法,它应该是这样的

    注意我不确定为什么要将作者 ID 作为 HTTPPOST 的查询字符串,因为 authorId 将是 post 模型本身的 author 属性的一部分,并且你可以随时验证if(IsValid(postModel.AuthorId)) 如果无效,则根据您的业务逻辑,先创建作者,然后创建帖子,或者发送回复说badrequest 并且作者必须存在

       [HttpPost]
       [Route("{authorid}")]
       public Task<IActionResult> MyPostMethod(string authorid, [FromBody] Post postModel)
        { 
                // yourWork
        }
    

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2021-10-12
      • 2017-07-22
      • 2022-01-02
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多