В 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 *Метод 1025 * в обоих случаях такой:
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());
НО вопрос в том, как это может зависеть от Экземпляр модели а не только тип?! ... Как я вижу, через эти классы нет доступа к Model .Есть ли место в пайплайне MVC, чтобы изменить эти два класса провайдеров на основе данных модели?(например, в: OnActionExecuting или что-то еще?)