首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MetadataType问题

MetadataType问题
EN

Stack Overflow用户
提问于 2009-12-09 11:58:45
回答 3查看 7.3K关注 0票数 3

我正在使用VS2008 SP1,WCF Ria服务2009年7月CTP。我发现MetadataType不能在部分类模式下工作,真的不知道我错过了什么:

工作:-

代码语言:javascript
复制
public partial class Person
{
    private string _Name;

    [Required(AllowEmptyStrings=false, ErrorMessage="Name required entry")]
    [StringLength(3)]
    public string Name
    {
        set{_Name = value;}
        get{return _Name;}
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person { Name="123432" };
        List res = new List();
        Validator.TryValidateObject(p,new ValidationContext(p,null,null),
            res,true);
        if (res.Count > 0)
        {
            Console.WriteLine(res[0].ErrorMessage);
            Console.ReadLine();
        }
    }
}

不工作

代码语言:javascript
复制
public partial class Person
{
    private string _Name;

    public string Name
    {
        set{_Name = value;}
        get{return _Name;}
    }
}

[MetadataType(typeof(PersonMetadata))]
public partial class Person
{
}


public partial class PersonMetadata
{
    [Required(AllowEmptyStrings=false, ErrorMessage="Name required entry")]
    [StringLength(3)]
    public string Name;
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person { Name="123432" };
        List res = new List();
        Validator.TryValidateObject(p,new ValidationContext(p,null,null),
            res,true);
        if (res.Count > 0)
        {
            Console.WriteLine(res[0].ErrorMessage);
            Console.ReadLine();
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2010-03-18 10:50:38

编辑:我在这里找到了答案:http://forums.silverlight.net/forums/p/149264/377212.aspx

验证前,需要手动注册元数据类:

代码语言:javascript
复制
TypeDescriptor.AddProviderTransparent(
            new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Person), typeof(PersonMetadata)), typeof(Person));

        List<ValidationResult> res = new List<ValidationResult>();
        bool valid = Validator.TryValidateObject(p, new ValidationContext(p, null, null), res, true);

(原答案如下)

问题并不是特定于您的分部类,而是Validator.TryValidateObject似乎无法识别MetaDataType属性。我也有同样的问题--MVC2中的内置验证可以识别元数据类,但是TryValidateObject不能。

查看这些:Validating DataAnnotations with Validator class Validation does not work when I use Validator.TryValidateObject

顺便说一句,我不知道这是否有必要,但我见过的元数据类的所有示例都在每个属性上使用默认的get/set:

代码语言:javascript
复制
[Required(AllowEmptyStrings=false, ErrorMessage="Name required entry")]
[StringLength(3)]
public string Name { get; set; }
票数 10
EN

Stack Overflow用户

发布于 2015-05-08 23:37:18

非常感谢Jeremy Gruenwald上面的答案。我完全被困在这个问题上了。

我想基于这个解决方案创建一个标准的验证类,但我不想传入元数据类类型,因为它让人感觉很难看。

为了实现这一点,我创建了一个静态类,它在自定义属性上进行查找以获得元数据类类型,然后在返回验证结果之前注册该类。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace MyApp.Validation
{
    public static class EntityValidator
    {
        public static List<ValidationResult> Validate(object instance, bool validateAllProperties = true)
        {
            RegisterMetadataClass(instance);

            var validationContext = new ValidationContext(instance, null, null);
            var validationResults = new List<ValidationResult>();

            Validator.TryValidateObject(instance, validationContext, validationResults, validateAllProperties);

            return validationResults;
        }

        private static void RegisterMetadataClass(object instance)
        {
            var modelType = instance.GetType();
            var metadataType = GetMetadataType(modelType);

            if (metadataType != null) 
            {
                TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(modelType, metadataType), modelType);
            }
        }

        private static Type GetMetadataType(Type type)
        {
            var attribute = (MetadataTypeAttribute)type.GetCustomAttributes(typeof (MetadataTypeAttribute), true).FirstOrDefault();
            return attribute == null ? null : attribute.MetadataClassType;
        }
    }
}

用法很简单,如下所示:

代码语言:javascript
复制
var errors = EntityValidator.Validate(myEntity);
票数 3
EN

Stack Overflow用户

发布于 2016-04-27 22:05:19

如果你正在使用WPF和EF,这对我来说一直是有效的…

代码语言:javascript
复制
[MetadataType(typeof(Department.Metadata))]
public partial class Department : BaseModel
{
    static Department()
    {
        TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Department),typeof(Metadata)), typeof(Department));
    }
    private sealed class Metadata
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "Department Name is required.")]
        [StringLength(50, ErrorMessage = "Name must be between 3 and 50 characters.", MinimumLength = 3)]
        public string Name;

        [StringLength(250, ErrorMessage = "Name must be between 10 and 250 characters.", MinimumLength = 10)]
        public string Description;
    }
}

以及实现它的基类...

代码语言:javascript
复制
public abstract class BaseModel : IDataErrorInfo
{
    #region Validation
    string IDataErrorInfo.Error
    {
        get { return null; }
    }
    string IDataErrorInfo.this[string propertyName]
    {
        get
        {
            var propertyInfo = GetType().GetProperty(propertyName);
            var results = new List<ValidationResult>();
            var result = Validator.TryValidateProperty(propertyInfo.GetValue(this, null), new ValidationContext(this, null, null)
            {
                MemberName = propertyName
            }, results);

            if (result) return string.Empty;
            var validationResult = results.First();
            return validationResult.ErrorMessage;
        }
    }
    #endregion
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1871499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档