ASP.NET Core MetaDataType属性不起作用

时间:2016-01-03 13:15:05

标签: c# asp.net-core data-annotations

我在我的域模型类上使用MetaDataType属性。它应该将属性信息从引用的类移动到已设置MetadataType属性的类中。 但它并没有像宣传的那样做。造成这个问题的原因是什么?

[MetadataType(typeof(ComponentModelMetaData))]
public partial class Component
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Repo> Repos { get; set; }
    public string Description { get; set; }   
}


public class ComponentModelMetaData
{
    [Required(ErrorMessage = "Name is required.")]
    [StringLength(30, MinimumLength = 3, ErrorMessage = "Name length should be more than 3 symbols.")]
    public string Name { get; set; }
    public ICollection<Repo> Repos { get; set; }
    [Required(ErrorMessage = "Description is required.")]
    public string Description { get; set; }        
}

4 个答案:

答案 0 :(得分:32)

ASP.NET Core使用

Microsoft.AspNetCore.Mvc.Core.**ModelMetadataType** 

而不是

System.ComponentModel.DataAnnotations.**MetadataType** 

source

尝试将您的属性更改为[ModelMetadataType(typeof(ComponentModelMetaData))]

答案 1 :(得分:1)

这是我解决同一问题的方式,希望这可以解决您的问题。

实体类:

namespace CoreProject.Persistence.EFCore
{
    public partial class User
    {
        public User()
        {
            Reader = new HashSet<Reader>();
            Writer = new HashSet<Writer>();
        }

        public int UserId { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public string PasswordHashKey { get; set; }
        public byte Role { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime CreatedUtc { get; set; }
        public DateTime LastUpdateUtc { get; set; }
        public byte Status { get; set; }
        public bool Deleted { get; set; }
        public DateTime? ActivatedUtc { get; set; }
        public bool Test { get; set; }

        public virtual ICollection<Reader> Reader { get; set; }
        public virtual ICollection<Writer> Writer { get; set; }
    }
}

元数据:

namespace CoreProject.Persistence.EFCore
{
    [ModelMetadataType(typeof(IUserMetadata))]
    public partial class User : IUserMetadata
    {
        public string FullName => FirstName + " " + LastName;
    }

    public interface IUserMetadata
    {
        [JsonProperty(PropertyName = "Id")]
        int UserId { get; set; }

        [JsonIgnore]
        string Password { get; set; }
        [JsonIgnore]
        string PasswordHashKey { get; set; }
        [JsonIgnore]
        byte Role { get; set; }
    }
}

祝你好运...

答案 2 :(得分:1)

另一种方法...使用相同的名称空间

public class ApirolesMetaData
{
    [Required]
    public string Name { get; set; }
}


[ModelMetadataType(typeof(ApirolesMetaData))]
public partial class Apiroles
{

}

答案 3 :(得分:0)

我处于类似的情况,在编码开始之前数据库已经存在。因此,DB首先是自然的选择。生成的类,都没有注释。因此添加了MetadataType,并找到了这个stackOverflow页面-因此尝试了ModelMetadataType。我针对一个类以及一个接口尝试了它。

我尝试使用var validationContext = new ValidationContext(model);

代替var editContext = new EditContext(model);

当我使用var result = Validator.TryValidateObject(model, validationContext, xxxxx, validateAllProperties: true);

时会更进一步

我以为我尝试editContext.AddDataAnnotationsValidation();

时就发现了

尽管这对带有注释的类有效,但对使用[MetadataType][ModelMetadataType]属性的局部类却不起作用(对我来说)。

我发现对我来说唯一可行的解​​决方法是创建一个新类,该新类包装要注释的模型。这意味着相同的属性,但吸气剂和吸气剂指向原始模型。但是至少注释会起作用!

public class Model
{
    public int ID { get; set; }

    public string Name { get; set; }
}

public class AnnotatedModel
{
    private readonly Model model;

    public AnnotatedModel(Model model)
    {
        this.model = model;
    }

    [Range(1, int.MaxValue)]
    public int ID { get => model.ID; set => model.ID = value; }

    [Required]
    [StringLength(maximumLength: 10, ErrorMessage = "Name can't be longer than 10 characters.")]
    public string Name { get => model.Name; set => model.Name = value; }
}

因此,要使用以上内容,我需要编写以下内容:

var model = new Model();
var annotatedModel = new AnnotatedModel(model);
var editContext = new EditContext(annotatedModel);
editContext.AddDataAnnotationsValidation();
var result = editContext.Validate();

如果有人可以告诉我我所缺少的内容,那就太好了!否则,我希望这种解决方法对某人有用。