asp.net-mvc-3 – 企业中业务实体验证的首选方法
让我先说明这个问题并说明使用实体框架不是我们的选择.
在我们的金融机构中,我们拥有将在整个解决方案中使用的业务实体.有些人拥有其他人没有的UI.验证和业务规则必须包含在实体中. 我针对为我生成的DAL和DTO进行编码,这些DAL使用procs在DB上运行CRUD(可能是SQL可能是Oracle). 因此,当我创建MVC,WCF,控制台应用程序等时,如果可以实现更好的验证方法,那么问题一直在唠叨. 以下是实体对象中的几个典型属性: [DefaultValue("")] public string Branch { get { return _branch; } set { if (value != null && value == _branch) return; const string propertyName = "Branch"; ValidationInstance.Clear(propertyName); ValidationInstance.ValidateRequired(propertyName,value); ValidationInstance.ValidateNumeric(propertyName,value); ValidationInstance.ValidateLength(propertyName,value,2); _branch = value; if (EntityState != EntityStateType.New) EntityState = EntityStateType.Changed; } } [DefaultValue(0)] public decimal HighDefermentMargin { get { return _highDefermentMargin; } set { if (value == _highDefermentMargin) return; const string propertyName = "HighDefermentMargin"; ValidationInstance.Clear(propertyName); ValidationInstance.ValidateRange(propertyName,value); _highDefermentMargin = value; if (EntityState != EntityStateType.New) EntityState = EntityStateType.Changed; } } 正如您所看到的,有一些数据注释和对验证类的显式调用,以执行越来越详细的验证. 在MVC应用程序中,我们在ViewModel上精心复制验证,因此我们获得客户端和服务器端验证.以下是上面相同属性的ViewModel版本: [Required] [Range(0.0,99.99)] [Display(Name = "High Deferment Margin")] public decimal HighDefermentMargin { get; set; } 这里的主要区别是实体中的验证将错误加载到Validation类的错误集合中,可以在实体保存自身时查询.如果(!IsValid)则抛出包含错误数组的自定义异常.控制器通过它们循环并将它们添加到ModelState. 我开始研究一些几乎有几百个字段的类.即使他们被OO分解,领域的数量仍然很高.这些是贷款证明等,其中包含大量单个记录的数据.必须写出许多属性的验证让我想要呕吐.我不能只编写一个实用程序来生成实体和验证,因为业务规则是驱动验证的因素,而不是数据库.意味着字段可以在db中为空,但不允许根据业务规则保持为null,或者该字段可以为null,但仅当单独的字段具有值等时. 那么,只能使用View Model中的数据注释和实体以相同的方式实现相同的结果吗?我可以为非标准验证编写自定义验证器,然后为更复杂的东西编写业务规则.验证错误是否会从实体中升级到更高级别,因此UI可以以与ModelState相同的友好方式通知用户?在这种情况下,其他人在做什么? 解决方法
通常,属性上的验证属性可以获得不同的验证结果(验证通过与否),具体取决于它是在UI层,BUsiness层还是DAL中进行评估.例如,考虑一个必需属性,如果在ViewModel上应用它可能会失败,但是在业务层中它可以简单地传递,因为用户未提供的值是从其他来源提供的.
但是,验证规则(如电子邮件的格式)始终会得到相同的结果.但是,存在可能需要在业务层中重复验证的精简问题……仅仅因为Web服务器更容易受到攻击并且更容易受到攻击.但是,重复两次相同的验证并不意味着编写两次代码.您可以在公共dll中收集要应用于多个图层的所有属性,您可以在其中定义应用于同一概念实体的各种版本(ViewModel,BL,DAL)的 MetaDataType.这样,您就可以在不重复代码的情况下满足安全要求. 根据saravanan的建议,您可以使用异常将在其他层中发现的验证错误传达给UI层(您还可以配置WCF以将异常详细信息传达给客户端) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET应用程序在3个物理层上
- asp.net-mvc – System.Web.MVC.UpdateModel可以
- asp.net-core – 构建asp.net核心错误
- asp.net – Mono apache2 =服务暂时不可用(503)
- 在MVC 4中使用ASP.Net Identity
- asp.net-mvc – Angular.js和WebAPI CRUD示例
- asp.net-mvc-3 – 为什么我的自定义HTML助手结果
- 剃刀 – 在身份3中创建声明身份
- asp.net – 以编程方式将HTML转换为Markdown语法
- entity-framework – 在Junction表上使用EF Core