在 ASP.NET Core 8 中哪里添加验证属性:模型还是 DTO?

问题描述 投票:0回答:1

我正在学习 ASP.NET Core 8 并尝试了解将验证属性应用于数据的最佳实践。

我遇到过这样的情况:我在项目中同时使用模型和 DTO。例如:

  • 模型代表了我的数据库中数据的结构。

  • DTO 用于在层(例如控制器和服务)之间传输数据。

我对应该在哪里添加验证属性感到困惑。应该将它们添加到模型、DTO 还是两者中?

在两个类中重复验证会被认为是不好的做法吗?

代码示例:

//Model Class

public class User
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    [EmailAddress]
    public string Email { get; set; }
}
//DTO
public class CreateUserDto
{
    [Required]
    [StringLength(50)]
    public string Name { get; set; }

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

那么,即使

CreateUserDto
模型中存在相同的验证,是否有必要在
User
中复制验证属性?

我正在尝试遵循良好实践,但我不确定跨模型和 DTO 重复验证是否是正确的方法。

任何对此的建议将不胜感激

c# asp.net-mvc validation model-validation data-transfer-objects
1个回答
0
投票

实体或数据库模型的验证属性:

可以为您的数据模型使用验证属性,因为我们不希望将某些内容插入到数据库中,从而违反该表字段的规则,您也可以使用流畅的验证来执行相同的操作

数据传输对象 (DTO) 的验证属性:

为什么我们使用DTO? 例如,我们的项目中有一个方法可以获取如此多的参数,就像这样

public string UserAsString(string name, string family, int age , string email)
{
    return $"{name} {family} {age} {email}";
}

所以我们希望使方法更简洁,并将所有内容都作为 DTO

public class UserDto
{
    public string Name { get; set; }
    public string Family { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

并且方法会比以前更小

public string UserAsString(UserDto user)
{
    return $"{user.Name} {user.Family} {user.Age} {user. Email}";
}

但是有一个问题我们应该对 DTO 使用验证属性吗? 否,因为 DTO 的使用是在服务和存储库之间进行的,并且其中的数据是通过请求模型进行验证的

请求模型的验证属性: 最好在请求模型上使用验证来控制请求数据并通知用户数据是否无效

 public class CreateUserRequestModel
{
    [Required(ErrorMessage = "Name is required.")]
    [StringLength(50, ErrorMessage = "Name cannot exceed 50 characters.")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Family is required.")]
    [StringLength(50, ErrorMessage = "Family name cannot exceed 50 characters.")]
    public string Family { get; set; }

    [Required(ErrorMessage = "Age is required.")]
    [Range(0, 120, ErrorMessage = "Age must be between 0 and 120.")]
    public int Age { get; set; }

    [Required(ErrorMessage = "Email is required.")]
    [EmailAddress(ErrorMessage = "Invalid email address.")]
    public string Email { get; set; }
}

和操作代码

public IActionResult CreateUser(CreateUserRequestModel userRequest)
    {
        if (!ModelState.IsValid)
        {
            // Handle validation errors
            return BadRequest(ModelState);
        }
    
        // Process valid user data
        return Ok("User created successfully!");
    }
© www.soinside.com 2019 - 2024. All rights reserved.