【问题标题】:Validate partial class with metadata使用元数据验证部分类
【发布时间】:2019-10-25 07:27:05
【问题描述】:

我正在尝试验证具有部分类和元数据类的类。 当我直接在类中指定属性时,验证有效,而当通过元数据时,则无效。 如何验证我的课程?

public class EntityMetadata
{
    [Required] // when through metadata it doesn’t work
    public string Property { get; set; }
}

[MetadataType(typeof(EntityMetadata))]
public partial class Entity
{

}

public partial class Entity
{
    [Required] // when directly it works
    public string Property { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Entity entity = new Entity();

        var context = new ValidationContext(entity, null, null);

        var results = new List<ValidationResult>();

        Validator.TryValidateObject(entity, context, results, true);

    }
}

【问题讨论】:

  • 检查this是否解决了您的问题..
  • 这个问题是否缺少标签?什么技术使用[Required]标签?
  • AssociatedMetadataTypeTypeDycriptionProvider 注册有帮助。但对于其他实体,我将不得不不断手动执行此操作。有什么方法可以获取附加到此类的所有元数据类?

标签: c# validation


【解决方案1】:

你需要用AssociatedMetadataTypeTypeDescriptionProvider注册MetadataType

如果您想避免单独为所有类型执行此操作,您可以为给定 assembly 中的所有类型自动调用此操作。

using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace TestConsole
{
    public class EntityMetadata
    {
        [Required]
        public string Property { get; set; }
    }

    [MetadataType(typeof(EntityMetadata))]
    public partial class Entity
    {
    }

    public partial class Entity
    {
        public string Property { get; set; }
    }

    class Program
    {
        static void Main()
        {
            foreach (var type in typeof(Entity).Assembly.GetTypes())
            {
                TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(type), type);
            }

            Entity entity = new Entity();
            var context = new ValidationContext(entity, null, null);
            var results = new List<ValidationResult>();

            Validator.TryValidateObject(entity, context, results, true);
        }
    }
}

【讨论】:

    【解决方案2】:

    如果你使用 .NETFramework v4.7.x 和 System.ComponentModel.DataAnnotations,你可以在执行后在结果对象中找到验证:

    results[0]
    

    代码:

            Entity entity = new Entity();
    
            var context = new ValidationContext(entity, null, null);
    
            var results = new List<ValidationResult>();
    
            TypeDescriptor.AddProviderTransparent(
            new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Entity), typeof(EntityMetadata)), typeof(Entity));
    
            Validator.TryValidateObject(entity, context, results, true);
    

    【讨论】:

    • 验证结果进入结果列表,但如果在元数据类中指定了Required属性,则不会使用Required属性验证Property字段。 AssociatedMetadataTypeTypeDycriptionProvider 注册有帮助。但对于其他实体,我将不得不不断手动执行此操作。有什么方法可以获取附加到此类的所有元数据类?
    • 您可以创建一个继承自Validator的类并重写AddProviderTransparent方法并在那里添加AssociatedMetadataTypeTypeDescriptionProvider
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多