【问题标题】:Making validation part of application settings使验证成为应用程序设置的一部分
【发布时间】:2010-08-30 16:19:27
【问题描述】:

我正在寻找使用验证应用程序块的基于配置的验证示例。我找到了this

我想问是否有人有替代解决方案来使用 EL VAB 5.0 来实现基于配置的验证。我从 DataAnnotations 开始,但很快发现某些属性需要不同类型的验证,具体取决于谁在使用应用程序。

另外,如果有人有更多关于使用 VAB 进行配置的示例以及关于我可能遇到的任何建议,请分享。

【问题讨论】:

  • 我想知道在运行时动态附加属性的某种 IoC 容器是否可以工作?
  • 它对我有用,但还没有在任何地方看到它的样本。
  • 我可能已经猜到了,这样的事情甚至是不可能的。属性是类型元数据,因此在运行时附加它们的唯一方法是生成一个全新的类型。话虽如此,您可以使用不同的模型类型,它们都继承一个基本类型,但定义唯一的验证规则。即产品 > AdminProduct > ClientProduct。除非特别标记,否则不会继承属性值。
  • @Nathan Taylor, @Mare,如果您正在寻找动态验证的“内置”解决方案,可以通过 ModelValidatorProvider 在运行时附加 DataAnnotation 属性。我甚至使用这种技术从数据库中提取验证信息,用于一个非常动态验证的系统。
  • 请发布详细信息作为答案

标签: asp.net-mvc validation enterprise-library validation-application-bl


【解决方案1】:

您可以通过多种途径来实现这一目标。首先,您可以(ab)为此使用规则集。您可以创建一个“基本”规则集,其中包含适用于所有人的规则,您可以为系统中的每个角色创建一个规则集,甚至可能为每个用户创建一个规则集,但这当然会很麻烦。

另一种选择是创建一个IConfigurationSource 实现,该实现能够根据登录的用户返回一个ValidationSettings 实例。现在有几种方法可以构建ValidationSettings 对象。以下是几个例子:

  1. 您可以根据角色使用FileConfigurationSource 从磁盘加载多个配置文件。比如:return (new FileConfigurationSource('validation_' + role + '.config')).GetSection(sectionName);
  2. 您可以动态构建ValidationSettings 实例(并缓存它们)。您可以将此定义存储在数据库中并加载它们(这将是很多工作)或在代码中定义它们(可能由程序集分隔)。 Here is an example 基于代码的配置。

此外,为了避免重复部分配置,您可以执行以下操作:

  1. 将多个配置合并在一起。例如,您可以将基线验证与角色特定验证合并。这使您不必根据基线手动验证并为特定于角色的验证进行第二次验证。虽然不支持开箱即用,但我在我的博客 here 上写了如何做到这一点。
  2. 您可以根据类型继承合并规则。虽然 VAB 仅支持开箱即用的基于属性的验证的验证器继承,但我已经在我的博客 here 上写过这方面的内容。

我希望这会有所帮助。

【讨论】:

  • 这就是我一直在寻找的关于 VAB 的内容。我现在只需要决定是实际使用 VAB 还是使用其他东西,因为这会在应用程序中引入另一段代码,这在一定程度上会使开发复杂化。
  • @Mare:您可能会从我在 SO 上的回答和我的博客文章中注意到,我真的很喜欢 VAB。然而,它的灵活性是有代价的。这不是一个简单的框架。我自己仍在寻找用 VAB 做事的新(更好)方法(我喜欢它的原因之一)。如果您选择与 VAB 合作并遇到任何问题,我将很乐意为您提供帮助。但至少,我祝您好运,为您和您的团队选择正确的框架。
  • 几个月前我写了一个答案,我在其中展示了如何使用 VAB 进行流畅的配置:stackoverflow.com/a/8906203/264697
猜你喜欢
  • 2017-01-14
  • 2010-09-18
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多