C# DTO上的ASP.NETWebAPI验证属性?

C# DTO上的ASP.NETWebAPI验证属性?,c#,entity-framework,validation,asp.net-web-api,C#,Entity Framework,Validation,Asp.net Web Api,我正在使用ASP.NETWebAPI和代码优先实体框架,从我所读到的内容来看,您通常应该在操作方法中直接公开DTO对象,而不是实体对象(根据) 因此,在我正在处理的一个案例中,为了避免上面链接中描述的“过度发布”问题,我创建了一个DTO对象,它的属性几乎与模型对象相同。然而,我想知道的是,我是否需要为DTO和模型属性复制所有相同的验证属性集(例如[Required]、[Range(N,m)],等等?最初我希望不这样做(以避免重复),但如果您想利用绑定验证(即ModelState.IsValid)

我正在使用ASP.NETWebAPI和代码优先实体框架,从我所读到的内容来看,您通常应该在操作方法中直接公开DTO对象,而不是实体对象(根据)

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

没有更好的办法了吗


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

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

长话短说:

  • 实体只获取实际影响数据库模式的属性

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

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

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

您好,
Voltaic

“将数据交换到型号”然后验证模型,这将如何工作?使用swap,我猜你的意思是将dto映射到模型?如果是,ModelState仍将在dto上运行,因为这一个已通过。简短的故事:你是否将必需的属性放在dto上?你可以使用AutoMapper或任何其他框架将dto映射到模型,或者简单地手工操作。必需的属性用于确保您愿意处理的dto状态。模型不需要必需的属性,只需要dto。您可以为模型编写一个基类,将dto作为某种状态保存,然后您可以将dto的属性作为模型的属性公开。如果是这样,那么转换策略是什么将有关基础模型的信息提供给客户端?如果字段无效,最好在不影响服务器的情况下知道。我认为,如果在更新操作中使用dto,则将验证或其他业务逻辑放入dto中,以便客户端可以提前知道如何形成请求。您可以定义验证规则,例如FluentValidation。验证器将检查持有DTO作为其内部状态的模型。使用客户机的开发人员必须也可能不应该知道DTO。一个干净的模型,有自己的验证器,可以满足我们当前的大多数需求。这当然只是多种处理方式之一我不同意这种情况。有时将DTO同时用作输入和输出是很常见的,DTO模型是控制器操作的输入,验证由框架处理,您可以使用
ModelState.IsValid
进行检查。