实施例。
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;。我该怎么办?
答案 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()));