【问题标题】:.NET MVC solution with DAL project: where to put custom validation attributes (server-side and client-side)带有 DAL 项目的 .NET MVC 解决方案:放置自定义验证属性的位置(服务器端和客户端)
【发布时间】:2021-01-09 01:55:38
【问题描述】:

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

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

namespace MyApp.CustomAttributes {

    public class RequiredIfSomething : ValidationAttribute, IClientValidatable {
        public RequiredIfSomething() { }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
            //server-side validation code here
            return ValidationResult.Success;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
            // client-side validation code here. 
            yield return rule;
        }
    }
}

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

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

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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 2014-11-03
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多