加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 在运行时更改viewmodel的MetadataType属性

发布时间:2020-12-16 03:55:10 所属栏目:asp.Net 来源:网络整理
导读:在Microsoft MVC 3.0中,我有一个类: public class Product{ public string Title {get;set;}} 此类可以表示为产品或服务,它们之间的唯一区别仅在于查看时的字段标签. 所以我创建了两个类: public class ProductMetaData { [Display(Name = "Product")] pub
在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或其他什么?)

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读