假设我有一个用户模型,该模型具有用于身份验证的Email
和Password
属性,如下所示:
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/