В 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);
}
}
BUT и следующие изменения в
ModelMetadataProviders.Current = new xx();
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new yy());
Global.asc. вопрос в том, как это может зависеть от экземпляра модели , а не только от типа?! ... Как я вижу, нет никакого доступа к модели через эти классы. Есть ли место в MVC pipleline для изменения этих двух классов поставщиков на основе данных модели? (например: OnActionExecuting или что-то еще?)