在运行时更改viewmodel的MetadataType属性

Mah*_*vej 6 data-annotations asp.net-mvc-3

在Microsoft MVC 3.0中,我有一个类:

public class Product{
    public string Title {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

此类可以表示为产品或服务,它们之间的唯一区别仅在于查看时的字段标签.

所以我创建了两个类:

 public class ProductMetaData
    {
        [Display(Name = "Product")]
        public object Title { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

public class ServiceMetaData
    {
        [Display(Name = "Service")]
        public object Title { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

如何在运行时将这些类设置为MetadataType

------------------------编辑------------------------- -

我发现我们可以通过继承DataAnnotationsModelMetadataProviderDataAnnotationsModelValidatorProvider类并在这两者中重写GetTypeDescriptor方法来设置/更改类型的元数据,如下所示:

 public class xx : DataAnnotationsModelMetadataProvider
{

    protected override ICustomTypeDescriptor GetTypeDescriptor(Type type)
    {

        if (type == typeof(InvoiceItemViewModel))
            return (new AssociatedMetadataTypeTypeDescriptionProvider(typeof(InvoiceItemViewModel), typeof(InvoiceItemMetaData))).GetTypeDescriptor(type);
        else
            return base.GetTypeDescriptor(type);
    }
}

 public class yy : DataAnnotationsModelValidatorProvider
{

    protected override ICustomTypeDescriptor GetTypeDescriptor(Type type)
    {

        if (type == typeof(InvoiceItemViewModel))
            return (new AssociatedMetadataTypeTypeDescriptionProvider(typeof(InvoiceItemViewModel), typeof(InvoiceItemMetaData))).GetTypeDescriptor(type);
        else
            return base.GetTypeDescriptor(type);
    }

}
Run Code Online (Sandbox Code Playgroud)

以及Global.ascx中的以下更改

ModelMetadataProviders.Current = new xx();

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new yy());
Run Code Online (Sandbox Code Playgroud)

但问题是如何将它依赖于模型实例而不仅仅是键入?!......正如我所看到的,通过这些类没有任何模型访问权限.MVC pipleline中是否有任何地方可以根据模型数据更改这两个提供者classess?(例如:OnActionExecuting或其他什么?)

Dar*_*rov 5

您可以编写自定义模型元数据提供程序.例如,您可以查看MvcExtensions.他们实现了这样的提供程序,以便能够在运行时动态地将元数据关联到给定类型.FluentValidation.NET使用相同的技术.

  • @MahmoudMoravej,这就是为什么我不使用DataAnnotations在我的应用程序中执行验证的原因.我使用FluentValidation.NET. (2认同)