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

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

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

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

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; }
}

最佳答案

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;
        }
    }
}

关于c# - 使用 Validator 时忽略 .NET 4 RTM MetadataType 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657358/

相关文章:

c# - 将 ValidationControls 动态添加到 updatepanel? [ASP.NET]

python - 使用 Python 原理图在必填字段中不允许任何内容

c# - 将 T[] 转换为 IList<T> 有什么注意事项吗?

java - BPEL 与领域事件集成多个有界上下文

c# - 在 ASP MVC 3 中创建可下载的文本文件时无法访问已关闭的流

asp.net - 在 ASP.NET 操作方法中发布和获取属性

c# - SerialPort_DataReceived 事件的问题

c# - 使用 AppSettings.json 和 Startup.cs 将服务引用注入(inject) .NET

c# - 如果我的类实现了 IEqualityComparer<T>,我是否应该实现非泛型 GetHashCode 和 Equals?

输入附加上的 jQuery 验证(Twitter Bootstrap)