首先给出一些上下文,我们将一个MVC应用程序插入Web API,它本身通过Entity Framework与至少一个SQL Sever DB进行通信;当用户可以编辑数据时,通信就会双向进行。
在所有图层上都有通过数据注释进行验证,即Db模型,DTO和ViewModel,它们在每一层上大部分都是相同的,非零无效,最小长度,这类事物。然而,我们确实有一些特殊的,复杂的,不断变化的业务逻辑,我们决定只在Web API中实现。
使用以下命令从Web API返回验证错误:
Request.CreateErrorResponse(System.Net.HttpStatusCode.OK, ModelState);
一些自定义标头允许MVC端的HttpClient包装器处理响应,因为错误将内容转换为ModelStateDictionnary
我的问题与ModelState错误目标属性名称有关,因为DTO和ViewModel不完全相同,我需要映射ModelState错误,因此它将指向ViewModel属性而不是DTO,例如,如果我从Web API收到以下ModelState:
{"CustomerDTO.full_name", "The full name needs to be unique"}
我需要它成为:
{"CustomerViewModel.FullName", "The full name needs to be unique"}
因此它可以显示在视图的正确位置。
目前我正在手动执行此操作,例如初始DTO到ViewModel对象映射,除非我的Google-fu教导失败了,否则.NET中似乎没有任何方法可以自动执行此操作,可以说也没有对象映射,但我计划尝试使用AutoMapper将对象映射到一起,然后重用映射来处理ModelState错误。
在我浪费3天之前,可能在这个过程中几次撞到桌面上,有没有人遇到过这个问题?这看起来像一个合理的方法吗?如果没有,是否有更好的解决方案?
由于
答案 0 :(得分:0)
看起来你的Web Api就像一个REST api,可以与db通信。你不应该直接将任何东西(DTO等)连接到你的MVC,这使得两者紧密耦合。我建议在两组DTO上保留数据注释属性。显然,你的MVC应用程序的视图模型可能与我猜的ViewModel的Web Api略有不同。
如果它们都在同一个解决方案中,并且您希望MVC和Web API都使用相同的DTO,则可以在同一个解决方案中创建一个新的Common Project,然后将DTO放在那里,并在两个位置引用该项目。 / p>
要记住的重要一点是,您需要始终在WebApi中验证您的输入。不要相信你的mvc应用程序发布的内容。