在运行时更改viewmodel的MetadataType属性

时间:2011-12-25 09:49:14

标签: asp.net-mvc-3 data-annotations

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

public class Product{
    public string Title {get;set;}
}

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

所以我创建了两个类:

 public class ProductMetaData
    {
        [Display(Name = "Product")]
        public object Title { get; set; }
    }

public class ServiceMetaData
    {
        [Display(Name = "Service")]
        public object Title { get; set; }
    }

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

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

我发现我们可以通过继承 DataAnnotationsModelMetadataProvider DataAnnotationsModelValidatorProvider 类并在两者中覆盖 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);
    }

}

Global.ascx中的以下更改

ModelMetadataProviders.Current = new xx();

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new yy());

但问题是如何依赖模型实例而不仅仅是键入?!...因为我看到通过这些类无法访问模型 。 MVC pipleline中是否有任何地方可以根据模型数据更改这两个提供者classess? (例如:OnActionExecuting或其他什么?)

1 个答案:

答案 0 :(得分:5)

你可以写一个custom model metadata provider。例如,您可以查看MvcExtensions。他们实现了such provider,以便能够在运行时将元数据动态关联到给定类型。 FluentValidation.NET使用了相同的技术。