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

标签 model-view-controller data-annotations

我正在使用 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/

相关文章:

javascript - 发布值形成复选框数组

reactjs - 为什么 React 不被视为 MVC?

c# - IsValid(object value) 尚未被此类实现

带有 StringLength 属性的尾随空格的 jQuery 验证处理

python - Django 在 vi​​ews.py 或模板中检查 user.is_authenticated 更好吗?

.net - 如何在布局 View 中使用 dbcontext(在 .NET MVC、 Entity Framework 中)

asp.net - 可以在 Blazor Server App 中使用区域吗?

asp.net-mvc-3 - 范围验证在 MVC3 中无法正常工作

asp.net-mvc-3 - CompareAttribute 并与复杂类型的属性进行比较

asp.net-mvc - 可以在运行时更改数据注释吗? (ASP.NET MVC 的 [Range] [Required] [StringLength] 等)