Model view controller 使用具有MVC DataAnnotation和MetaDataType的多个接口

Model view controller 使用具有MVC DataAnnotation和MetaDataType的多个接口,model-view-controller,data-annotations,Model View Controller,Data Annotations,我将使用DataAnnotations对MVC ViewModel进行验证,MVC ViewModel是几个实体框架对象和一些自定义逻辑的组合。已经为接口中的实体对象定义了验证,但是如何将此验证应用于ViewModel 我最初的想法是将界面合并为一个界面,并将合并后的界面应用于ViewModel,但这不起作用。下面是一些示例代码,演示了我的意思: //包含实体框架类实现的DataAnnotation的接口 公共接口IPerson { [必需] [显示(Name=“First Name”)] 字符

我将使用DataAnnotations对MVC ViewModel进行验证,MVC ViewModel是几个实体框架对象和一些自定义逻辑的组合。已经为接口中的实体对象定义了验证,但是如何将此验证应用于ViewModel

我最初的想法是将界面合并为一个界面,并将合并后的界面应用于ViewModel,但这不起作用。下面是一些示例代码,演示了我的意思:

//包含实体框架类实现的DataAnnotation的接口
公共接口IPerson
{
[必需]
[显示(Name=“First Name”)]
字符串名{get;set;}
[必需]
[显示(Name=“Last Name”)]
字符串LastName{get;set;}
[必需]
int Age{get;set;}
}
公共界面设计
{
[必需]
[显示(Name=“Street”)]
字符串Street1{get;set;}
[显示(名称=”)]
字符串Street2{get;set;}
[必需]
字符串城市{get;set;}
[必需]
字符串状态{get;set;}
[必需]
字符串国家{get;set;}
}
//用于指定接口的部分实体框架类
公共部分类人员:IPerson{}
公共部分类地址:IAddress{}
//组合界面
公共接口IPersonViewModel:IPerson,IAddress{}
//ViewModel展平带有地址的人员以在视图中使用

[MetadataType(typeof(IPersonViewModel))]/为了实现此功能,您需要手动将接口关联为具体类的元数据

我希望能够添加多个MetadataType属性,但这是不允许的

[AttributeUsage(AttributeTargets.Class,AllowMultiple=false)]//注意AllowMultiple
公共密封类MetadataTypeAttribute:属性
因此,这会产生编译错误:

[MetadataType(typeof(IPerson))]

[MetadataType(typeof(iadress))]/根据这里的答案,我无法让MetadataTypeBuddy属性工作。我确信我们必须设置MVC应该调用该属性的位置。当我在应用程序_Start()中手动运行该属性时,我成功地使其工作,如下所示

new MetadataTypeBuddyAttribute(typeof(PersonViewModel), typeof(IPerson));
new MetadataTypeBuddyAttribute(typeof(PersonViewModel), typeof(IAddress));

MetadataTypeBuddy属性对我不起作用。
但是在“Startup”中添加“new”MetadataTypeBuddyAttribute确实有效,但是它会导致复杂的代码,开发人员不知道在“Startup”中为任何新类添加此属性

注意:在每个类启动应用程序时,只需调用AddProviderTransparent一次

下面是为一个类添加多个元数据类型的线程安全方法

[AttributeUsage(AttributeTargets.Class)]
公共类MetadataTypeMultiAttribute:属性
{
私有静态bool\u added=false;
私有静态只读对象挂锁=新对象();
公共MetadataTypeMultiAttribute(类型modelType,参数类型[]metaDataTypes)
{
锁(挂锁)
{
如果(_added==false)
{
foreach(metaDataTypes中的metaDataType类型)
{
System.ComponentModel.TypeDescriptor.AddProviderTransparent(
新关联的MetadataTypeDescriptionProvider(
型号,
元数据类型
),
模型类型);
}
_添加=真;
}
}
}
}

请告诉我,你找到了一个很好的解决方案——这个想法太酷了,我都快抓狂了。从未考虑过替换MetadataType属性。我知道这已经有很长一段时间了,但这可能仍然很有用,因为我们仍然有冗余的元数据模型可以从中受益。