带有 DAL 项目的 .NET MVC 解决方案:在哪里放置自定义验证属性服务器端和客户端

问题描述

.NET MVC 应用程序,使用 Identity 和 EF 代码优先。 在其中我有一个 CustomValidations.cs,我在其中编写了一些自定义验证属性:其中一些包含服务器端和客户端验证。模型和视图模型都使用这些验证属性。 (客户端验证是通过实现 IClientValidatable 并添加方法 GetClientValidationRules 来完成的。

例如(它位于 MVC 项目中的文件夹 CustomAttributes/CustomValidations.cs 中):

page_type:

现在我正在尝试将不同项目中的解决方案分开。我首先为 DAL 层创建了一个类库项目 (MyApp.DAL),并将我所有的实体框架实体、dbcontext(ApplicationDbContext,这是一个 IdentityDbContext)和迁移文件夹从 MVC 项目移动到新项目,添加了引用在 MVC 项目和修改的命名空间等中。 所以现在MVC项目使用的是DAL项目。

所有这些似乎都有效,但现在我的自定义验证器有问题: 我猜这些验证(或至少其中一些)应该驻留在 DAL 项目中,因为我正在用它们装饰模型属性。但是,我在 DAL 项目中不仅会进行服务器端验证,还会进行我认为应该特定于 mvc 的客户端验证(因此,不应驻留在 DAL 项目中)...

这样做的正确方法是什么?

解决方法

通常,这是通过使用 web 层中的视图模型和数据访问层中的基本 EF 模型来解决的。您用于验证客户端输入等的自定义验证器将在您的视图模型上运行并驻留在 web 层中。您的模型的自定义验证器(通常是为了保护插入数据库的数据的完整性)将继续使用您的 EF 模型并驻留在数据访问层中。如果您不习惯这样做,有一些映射库可以帮助在原始 EF 模型和视图模型之间进行转换(自动映射器可能是最常见的)。