2011-12-25 6 views
4

В Microsoft MVC 3.0 У меня есть класс:изменения атрибута MetadataType ViewModel во время выполнения

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); 
    } 

} 

И следующие изменения в Glo bal.ascx

ModelMetadataProviders.Current = new xx(); 

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

но вопрос в том, как может зависеть от его экземпляра модели и не только печатать?! ... Как я вижу, что нет какой-либо доступ к модели через эти классы. Есть ли место в MVI pipleline для изменения этих двух классов класса на основе данных модели? (например, в: OnActionExecuting или что-то еще?)

ответ

5

Вы можете написать custom model metadata provider. Например, вы можете взглянуть на MvcExtensions. Они реализовали such provider, чтобы иметь возможность динамически связывать метаданные с заданным типом во время выполнения. Тот же метод используется FluentValidation.NET.

+1

ow! слишком сложная для этой простой задачи! Я предпочитаю найти обходное решение для этого! –

+2

@MahmoudMoravej, вот почему я не использую DataAnnotations для выполнения проверки в моих приложениях. Я использую FluentValidation.NET. –

Смежные вопросы