假设我有一个用户模型,该模型具有用于身份验证的EmailPassword属性,如下所示:

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上则不需要。即:创建新用户需要电子邮件和密码字段。但是在编辑时,我可以忽略这些属性。我知道可以存档该目标,以便在发布时从电子邮件和密码中删除[Required]并检查这些属性,但这似乎不是一个好习惯。

那么,对于此用例,还有更优雅的解决方案吗?

最佳答案

您不应将实体用作输入/输出参数。而是创建两个单独的视图模型来表示被调用的动作:

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)术语。

关于c# - 如何在POST上创建必需的属性,但在PUT请求上不设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50109886/

10-13 05:19