C# ASP.NET核心元数据类型属性不起作用

C# ASP.NET核心元数据类型属性不起作用,c#,asp.net-core,data-annotations,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 IC

我正在域模型类上使用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; }        
}
[MetadataType(typeof(ComponentModelMetaData))]
公共部分类组件
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection Repos{get;set;}
公共字符串说明{get;set;}
}
公共类ComponentModelMetaData
{
[必需(ErrorMessage=“名称是必需的。”)]
[StringLength(30,MinimumLength=3,ErrorMessage=“名称长度应大于3个符号)。]
公共字符串名称{get;set;}
公共ICollection Repos{get;set;}
[必需(ErrorMessage=“需要说明”)]
公共字符串说明{get;set;}
}
ASP.NET核心使用

Microsoft.AspNetCore.Mvc **ModelMetadataType** 
而不是

System.ComponentModel.DataAnnotations.**MetadataType** 


尝试将属性更改为
[modelmatatype(typeof(componentmodelmatadata))]

这就是我解决相同问题的方法,我希望这能解决您的问题

实体类:

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

祝你好运…

另一种方式。。。使用相同的名称空间

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


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

}

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

我尝试使用var validationContext=newvalidationcontext(model)

而不是
var editContext=新的editContext(模型)

当我使用
var result=Validator.TryValidateObject(model,validationContext,xxxxx,validateAllProperties:true)时,我得到了进一步的支持

当我尝试
editContext.AddDataAnnotationsValidation()时,我想我已经找到了答案

虽然这适用于带有注释的类,但对于使用
[MetadataType]
[ModelMetadataType]
属性的部分类(对我来说)不起作用

我发现(对我来说)唯一有效的解决方法是创建一个新类,该类封装您想要注释的模型。这意味着相同的属性,但getter和setter指向原始模型。但至少注释会起作用

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();

如果有人能告诉我我错过了什么,太好了!否则,我希望这项工作对其他人有用。

非常感谢您找到.NET Core 1.0的Microsoft.AspNetCore.Mvc.ModelMetadataTypeAttribute。。。不同的名称,不同的命名空间。。。不难找到。无论如何,这是正确的答案,因为分部类组件似乎是模型声明。我更喜欢使用名为与模型相同且位于与模型相同的逻辑命名空间中的分部类来将验证和元数据的注释应用于模型。这样,如果我从数据库中重新生成模型,我就不会丢失我的编辑。这种解决方案仍然适用于net core 3.0man。这种事情很残酷,每次我换用asp.net core之类的新技术,我都会遇到这些问题数周。我希望有一种方法可以将它们全部编译到某个地方(例如,“10件事会悄悄地出现在你身上,浪费你的时间,让你在切换到ASP.NET核心时感到不适”),也感谢你对这一点的回答。1个倒下,9个倒下:)啊。Microsoft.AspNetCore.Mvc应仅位于web级别。我讨厌把这件事推到一些商业领域我感觉到了你的痛苦。他们必须停止破坏这样的东西。这使得完成任何实际工作都非常困难。无论如何,找到了一个解决方案:TypeDescriptor.AddProvider(新的关联MetadataTypeDescriptionProvider(typeof(Model)、typeof(ModelMetadata))、typeof(Model));
var model = new Model();
var annotatedModel = new AnnotatedModel(model);
var editContext = new EditContext(annotatedModel);
editContext.AddDataAnnotationsValidation();
var result = editContext.Validate();