在运行时添加mvc模型验证属性

时间:2014-06-13 13:49:38

标签: c# asp.net-mvc validation data-annotations typedescriptor

我有一个域实体Person,它具有存储在Dictionary中的动态属性

每个属性都有一个名称,值,可以是不同类型(枚举)[电子邮件,号码等],也可以是属性。

使用基于属性类型的相应html控件渲染时,这些属性将映射到PropertyViewModel。

我还想添加DataAnnotaions验证属性Required,Email等,并在属性映射到PropertyViewModels时在运行时使用内置验证客户端/服务器

我在使用TypeDescriptor.AddAttribute时遇到了一些困难,但我无法让它发挥作用。有没有人对这种情况有好运?

修改: 我终于得到了TypeDescriptor和自定义ModelValidatorProver的组合来工作。 由于我在所有其他视图模型上使用验证属性并且不想要混合使用验证模式,因此我不想创建一个自定义模型验证器,它通过属性名和类型添加属性。

在渲染我的viewmodel之前,我使用TypeDescriptor修饰属性     TypeDescriptor.AddAttributes(propertyViewModel.Value,new EmailAttribute());     TypeDescriptor.AddAttributes(propertyViewModel.Value,new RequiredAttribute());

由于MVC默认的DataAnnotationsModelValidatorProvider不支持TypeDescriptor添加的属性。我创建了一个自定义的ModelValidation提供程序,它使用TypeDescriptor来查找验证属性。

public class TypeDescriptorModelValidationProvider : DataAnnotationsModelValidatorProvider
{
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {

        var attributesList = new List<Attribute>(TypeDescriptor.GetAttributes(metadata.Model).Cast<Attribute>());


        return base.GetValidators(metadata, context, attributesList);
    }
}

我在启动时替换当前的电流

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new TypeDescriptorModelValidationProvider());

0 个答案:

没有答案