3

是否可以将 selfvalidation 属性与位于元数据类型中的验证一起使用?我正在使用 Enterprise Library 5 的验证应用程序块。

4

2 回答 2

2

正如我在其他答案中解释的那样,开箱即用不支持此功能。但是,这可以通过使用依赖注入钩入框架并替换现有实现来AttributeValidatorFactory实现。我在我的博客上写了一篇关于如何做到这一点的文章:混合验证应用程序块与 DataAnnotation:SelfValidation 怎么样?

我希望这有帮助。

于 2010-09-12T17:59:03.790 回答
1

VAB 目前不支持(开箱即用)。例如,在 EntLib 论坛上查看此线程。我认为这不受支持的主要原因是你不能简单地将 [SelfValidation] 方法放在元数据类型上并期望它能够工作。它不起作用的原因是因为自我验证方法通常会验证该类型的实例成员。自验证方法的签名不包含要验证的实际对象。

一个简单的解决方法是从实体调用元数据类型。例如:

[MetadataType(typeof(InvoiceMetaData))]
[HasSelfValidation]
public partial class Invoice
{
    public string Name{ get; set; }

    public int Price { get; set; }

    [SelfValidation]
    public void CustomValidate(ValidationResults results)
    {
        // Call into the meta data class
        InvoiceMetaData.Validate(this, results);
    }
}

public class InvoiceMetaData
{
    [StringLengthValidator(1, 10, Tag = "Name")]
    string Name { get; set; }

    [RangeValidator(0, RangeBoundaryType.Inclusive, 0,
        RangeBoundaryType.Ignore, Tag = "Price")]
    int Price { get; set; }

    public static void CustomValidate(Invoice instance,
        ValidationResults results)
    {
        results.AddResult(new ValidationResult("ErrorMessage1",
            instance, "", "", null));
    }
}

这当然不是一个非常干净的解决方案。然而,VAB 是非常可扩展的,而且版本 5.0 只会变得更好。如果您愿意,可以交换现有AttributeValidationFactory版本并将其替换为能够执行此操作的版本。不过这并不容易。

干杯

于 2010-09-11T14:47:41.493 回答