gpt4 book ai didi

model-view-controller - 使用 MVC DataAnnotations 和 MetaDataType 的多个接口(interface)

转载 作者:行者123 更新时间:2023-12-04 08:40:18 24 4
gpt4 key购买 nike

我正在使用 DataAnnotations 对 MVC ViewModel 应用验证,它是几个 Entity Framework 对象和一些自定义逻辑的组合。已经为接口(interface)中的实体对象定义了验证,但是如何将此验证应用于 ViewModel?

我最初的想法是将接口(interface)组合成一个并将组合的接口(interface)应用到 ViewModel,但这并没有奏效。这是一些示例代码,演示了我的意思:

// interfaces containing DataAnnotations implemented by entity framework classes
public interface IPerson
{
[Required]
[Display(Name = "First Name")]
string FirstName { get; set; }

[Required]
[Display(Name = "Last Name")]
string LastName { get; set; }

[Required]
int Age { get; set; }
}
public interface IAddress
{
[Required]
[Display(Name = "Street")]
string Street1 { get; set; }

[Display(Name = "")]
string Street2 { get; set; }

[Required]
string City { get; set; }

[Required]
string State { get; set; }

[Required]
string Country { get; set; }
}

// partial entity framework classes to specify interfaces
public partial class Person : IPerson {}
public partial class Address : IAddress {}

// combined interface
public interface IPersonViewModel : IPerson, IAddress {}

// ViewModel flattening a Person with Address for use in View
[MetadataType(typeof(IPersonViewModel))] // <--- This does not work.
public class PersonViewModel : IPersonViewModel
{
public string FirstName { get; set; }

public string LastName { get; set; }

public int Age { get; set; }

public string Street1 { get; set; }

public string Street2 { get; set; }

public string City { get; set; }

public string State { get; set; }

public string Country { get; set; }
}

我的实际问题涉及 ViewModel 上的大约 150 个属性,因此它不像示例那么简单,重新键入所有属性似乎是对 DRY 的严重违反。

关于如何做到这一点的任何想法?

最佳答案

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

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

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

    [AttributeUsage(AttributeTargets.Class)]
public class MetadataTypeMultiAttribute : Attribute
{
private static bool _added = false;
private static readonly object padlock = new object();

public MetadataTypeMultiAttribute(Type modelType, params Type[] metaDataTypes)
{
lock (padlock)
{
if (_added == false)
{
foreach (Type metaDataType in metaDataTypes)
{
System.ComponentModel.TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(
modelType,
metaDataType
),
modelType);
}

_added = true;
}
}
}
}

关于model-view-controller - 使用 MVC DataAnnotations 和 MetaDataType 的多个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com