验证应用程序块 - 如何使用验证元数据类

时间:2012-08-09 09:18:31

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

我正在使用VAB来验证一些带有属性的类,而我正在使用元数据类在不同的类之间共享相同的验证。 当我尝试验证控制器中的对象时(顺便说一下,我使用的是asp.net mvc),ValidationResults没有错误,我的实体不应该有效。 但是,ASP.NET MVC是他的魔力,因为ModelState.IsValid是错误的。我想问题是我正在进行手动验证的方式。

在Global.asax中,我正在加载类和元数据类之间的关联。

Global.asax中

private static void RegisterMetadataExtensions()
{
    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;

    typeDescriptionProvider =
        new AssociatedMetadataTypeTypeDescriptionProvider(
            typeof(FooViewModel), typeof(FooMetadata));

    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider,
        typeof(FooViewModel));

    typeDescriptionProvider =
        new AssociatedMetadataTypeTypeDescriptionProvider(
            typeof(FooCommand), typeof(FooMetadata));

    TypeDescriptor.AddProviderTransparent(
        typeDescriptionProvider, typeof(FooCommand));
}

控制器

[HttpPost]        
public ActionResult Action(FooViewModel vm)
{
    Validator<FooViewModel> validator =
        ValidationFactory.CreateValidator<FooViewModel>();

    ValidationResults res = validator.Validate(vm);

    //res.Count is 0

OR

    ValidationResults res = Validation.Validate<FooViewModel>(vm);

    //res.Count is 0

    //ModelState.IsValid is false
    if(ModelState.IsValid)

欢迎任何想法。

先谢谢。

2 个答案:

答案 0 :(得分:1)

我是企业库的忠实粉丝,但我认为使用MVC进行验证的更好方法是使ViewModel实现IValidatableObject。这样,它会在设置ModelState.Isvalid

的绑定阶段自动验证

答案 1 :(得分:0)

为了让您的VAB验证器挂钩进入ASP.NET MVC的验证,我认为您需要实现ModelValidatorProvider并按照此处所述包装VAB验证结果... http://bradwilson.typepad.com/blog/2009/10/enterprise-library-validation-example-for-aspnet-mvc-2.html