Web.API,ASP .NET MVC和ModelState错误映射

时间:2015-12-04 11:41:50

标签: asp.net-mvc asp.net-web-api automapper modelstate

首先给出一些上下文,我们将一个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天之前,可能在这个过程中几次撞到桌面上,有没有人遇到过这个问题?这看起来像一个合理的方法吗?如果没有,是否有更好的解决方案?

由于

1 个答案:

答案 0 :(得分:0)

看起来你的Web Api就像一个REST api,可以与db通信。你不应该直接将任何东西(DTO等)连接到你的MVC,这使得两者紧密耦合。我建议在两组DTO上保留数据注释属性。显然,你的MVC应用程序的视图模型可能与我猜的ViewModel的Web Api略有不同。

如果它们都在同一个解决方案中,并且您希望MVC和Web API都使用相同的DTO,则可以在同一个解决方案中创建一个新的Common Project,然后将DTO放在那里,并在两个位置引用该项目。 / p>

要记住的重要一点是,您需要始终在WebApi中验证您的输入。不要相信你的mvc应用程序发布的内容。