C# 如何使POST请求中需要属性,而PUT请求中不需要属性

C# 如何使POST请求中需要属性,而PUT请求中不需要属性,c#,asp.net-core,C#,Asp.net Core,假设我有一个用户模型,它具有用于身份验证的电子邮件和密码属性,如下所示: public class User { public long Id { get; set; } [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } [Required] [EmailAddress] public s

假设我有一个用户模型,它具有用于身份验证的
电子邮件
密码
属性,如下所示:

public class User
{
    public long Id { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

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

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}
我的目标是使这些属性仅在POST请求时需要,而不是在PUT时需要。也就是说:创建新用户需要电子邮件和密码字段。但在编辑时,我可以忽略这些属性。我知道这个目标可以存档,从电子邮件和密码中删除
[必需]
,并在发布时检查这些属性,但这似乎不是一个好的做法


因此,对于这个用例有一个更优雅的解决方案?

一个建议是使用视图模型。在您的例子中,您可以有一个RegisterViewModel,它接受模型中的所有值,然后您可以有一个EditViewModel,它不包括电子邮件和密码。在控制器中,编辑功能可以替换其他字段的旧值,也可以忽略它们


不应将实体用作输入/输出参数。相反,创建两个单独的视图模型来表示所调用的操作:

public class User
{
    public long Id { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

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

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

// When creating, the client cannot know the Id because it doesn't exist
public class CreateUserViewModel
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

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

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

// and when updating, the Id is required but not the Email nor the Password
public class UpdateUserViewModel
{
    [Required]
    public long Id { get; set; } 

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

当然,由于您正在创建一个API,“视图模型”可能没有多大意义。您可以使用数据传输对象(DTO)术语。

然后为不同的操作使用单独的模型。这通常是通过为登录创建单独的模型来完成的。您可以在CLI中使用
dotnet new mvc-au Individual
检查结构,并检查项目。您可以设计自己的请求处理程序,根据方法(POST、PUT等)执行不同的操作。对于你上面的例子,我可能不推荐。嗨,卡米洛!回答得很好,谢谢!一点:除了在
updateUserModel
中重新声明所有属性,我可以扩展
User
并添加与凭据相关的属性吗?“这是个好习惯吗?”布鲁诺佩斯很乐意帮忙。我不会将以服务的客户机为中心的ViewModel与表示内部业务逻辑的实体混合使用。这是DRY原则不真正适用的地方之一,拥有重复的代码可能是正确的。所以我应该:1)始终保持一个用户实体;2) 发布时,我应该会收到一个CreateUserViewModel实例;3) 当输入时,我应该收到一个UpdateUserViewModel实例。对吗?@Brunopers完全正确!如果您使用单个用户帐户(aka Identity)创建一个新项目以避免代码重用,您会看到这种模式吗?假设我得到了
MaxLength
变量。我希望所有型号都有这个。但假设我改变了我的实体