gpt4 book ai didi

c# - DTO 上的 ASP.Net Web API 验证属性?

转载 作者:太空狗 更新时间:2023-10-29 20:23:48 27 4
gpt4 key购买 nike

我正在使用 ASP.Net Web API 和 Code First Entity Framework,根据我的阅读,您通常应该在操作方法中直接公开 DTO 对象而不是实体对象(根据 http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-5 )。

所以在我正在处理的一个案例中,为了避免上面链接中描述的“过度发布”问题,我创建了一个 DTO 对象,其属性几乎与模型对象完全相同。然而,我想知道的是,我是否需要为 DTO 和模型属性复制所有相同的验证属性集(例如 [Required]、[Range(N,M)] 等)?最初我希望不需要到(以避免重复)但是如果你想利用绑定(bind)验证(即 ModelState.IsValid),你需要 DTO 上的验证属性,如果你希望使用适当的约束创建数据库([Required ] -> 不为空等)

没有更好的办法吗?

另外,是否有一些实体确实使用但模型绑定(bind)验证没有使用的属性?例如,虽然 [Range(n,m)] 会明显影响某些客户端输入的验证,但实体是否根本关心它(据我所知,它似乎不会影响创建的数据库模式?)

最佳答案

实体应该只具有实际对数据库有影响的属性。DTO 不应该有任何用于验证的属性,除了 DataMemberAttribute 来定义属性是否是必需的以及它应该以什么顺序显示等。对于 OData,您还必须设置 KeyAttribute。模型应该具有验证属性。因为 DTO 和模型可能几乎相同,所以您为每个需要验证模型的 dto 创建了一个模型,只需将 dto 的值交换为模型的对象。现在您可以验证它,如果您没有对模型使用 ValidationAttributes,您可以验证它们,例如使用 FluentValidation

长话短说:

  • 实体只获取实际影响数据库架构的属性

  • DTO 是没有验证逻辑的简单对象,DataMemberAttribute 除外

  • 模型应具有验证属性(仅在需要时使用,使用 FluentValidation 时不需要)

POST 的工作流程是:-> DTO 进来 -> 将 dto 交换到模型 -> 验证模型 -> 将模型交换到实体 -> 在数据库中存储实体 -> 使用更新后的实体并将其交换到新的 dto -> 返回 dto

您好,伏打

关于c# - DTO 上的 ASP.Net Web API 验证属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com