使用Validator时忽略.NET 4 RTM MetadataType属性

时间:2010-04-17 05:20:41

标签: c# .net validation .net-4.0 metadatatype

我正在使用VS 2010 RTM并尝试使用MetadataTypeAttribute对简单类型执行一些基本验证。当我将验证属性放在主类上时,一切正常。但是,当我把它放在元数据类上时,它似乎被忽略了。我必须遗漏一些微不足道的东西,但我现在已经坚持了一段时间。

我查看了Enterprise Library验证块作为解决方法,但它不支持开箱即用的单个属性验证。有什么想法吗?

class Program
{
    static void Main(string[] args)
    {
        Stuff t = new Stuff();

        try
        {
            Validator.ValidateProperty(t.X, new ValidationContext(t, null, null) { MemberName = "X" });
            Console.WriteLine("Failed!");
        }
        catch (ValidationException)
        {
            Console.WriteLine("Succeeded!");
        }
    }
}

[MetadataType(typeof(StuffMetadata))]
public class Stuff
{
    //[Required]  //works here
    public string X { get; set; }
}

public class StuffMetadata
{
    [Required]  //no effect here
    public string X { get; set; }
}

2 个答案:

答案 0 :(得分:23)

似乎Validator不尊重MetadataTypeAttribute:

http://forums.silverlight.net/forums/p/149264/377212.aspx

必须明确注册关系:

 TypeDescriptor.AddProviderTransparent(
      new AssociatedMetadataTypeTypeDescriptionProvider(
          typeof(Stuff),
          typeof(StuffMetadata)), 
      typeof(Stuff)); 

此助手类将注册程序集中的所有元数据关系:

public static class MetadataTypesRegister
{
    static bool installed = false;
    static object installedLock = new object();

    public static void InstallForThisAssembly()
    {
        if (installed)
        {
            return;
        }

        lock (installedLock)
        {
            if (installed)
            {
                return;
            }

            foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
            {
                foreach (MetadataTypeAttribute attrib in type.GetCustomAttributes(typeof(MetadataTypeAttribute), true))
                {
                    TypeDescriptor.AddProviderTransparent(
                        new AssociatedMetadataTypeTypeDescriptionProvider(type, attrib.MetadataClassType), type);
                }
            }

            installed = true;
        }
    }
}

答案 1 :(得分:2)

向ValidationContext构造函数提供元数据类而不是主类的实例似乎对我有用。