如何将Display属性添加到模型中

时间:2018-01-24 10:25:06

标签: c# .net-core entity-framework-core

实施例。

public class Product
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string ProductName { get; set; }

    public int OrderId { get; set; }
    public Order Order { get; set; }
}

public class Order
{
    [Key]
    public int Id { get; set; }

    [Required]
    public DateTime OrderDate { get; set; }

    public IEnumerable<Product> Products { get; set; }
}

模型位于一个单独的项目中,因为我想在几个使用相同数据库的应用程序中使用它们。 &#39;显示&#39;属性名称在不同的应用程序中可以不同。我不能继承应用程序中的类并在元数据中设置属性,因为无法转换IEnumerable&lt; Product&gt;到IEnumerable&lt; DerivedProduct&gt;。我该怎么办?

2 个答案:

答案 0 :(得分:0)

有可能在单独的类中定义验证属性,然后通过MetadataType属性与原始类链接。

以下是Product类:

的操作方法

1.Declare ProductMetadata类具有与原始类相同的属性:

internal class ProductMetadata
{
    [Key]
    public int Id { get; set; }

    [Required]
    [Display(Name = "SomeName")]
    public string ProductName { get; set; }

    public int OrderId { get; set; }

    public Order Order { get; set; }
}

2.如果可能,请从原始类System.ComponentModel.DataAnnotations中删除Product命名空间中的所有属性。此步骤是可选的,适用于避免未使用的属性。如果您无法修改原始类或由于某些原因需要这些属性,请保持原样。

3.现在必须使用指定元数据类类型的MetadataType属性标记原始类。如果您可以将该属性添加到现有类Product,那么它很简单:

[MetadataType(typeof(ProductMetadata))]
public class Product
{
    // ...
}

但是,如果模型类在您描述的单独项目中,则可以动态分配该属性。将此代码放在靠近应用程序启动的位置:

TypeDescriptor.AddAttributes(typeof(Product), new MetadataTypeAttribute(typeof(ProductMetadata)));

那就是它。这些步骤应该可以解决问题。

答案 1 :(得分:0)

好。不可能自动从其他类添加属性。您需要编写自己继承自IDisplayMetadataProvider的元数据提供程序(如果需要编辑属性显示设置)或/和IValidationMetadataProvider(如果需要编辑属性验证消息)。

   public class MyMetadataProvider : IDisplayMetadataProvider, IValidationMetadataProvider
    {
        public void CreateDisplayMetadata(DisplayMetadataProviderContext context)
        {
        }

        public void CreateValidationMetadata(ValidationMetadataProviderContext context)
        {
        }
    }

在ASP .NET Core MVC中,您需要将提供程序的实例添加到Startup.cs中的提供程序列表。

services.AddMvc(c=>c.ModelMetadataDetailsProviders.Add(new MyMetadataProvider()));