Изменение атрибута MetadataType viewmodel во время выполнения
В Microsoft MVC 3.0 у меня есть класс:
public class Product{
public string Title {get;set;}
}
Этот класс может быть представлен как Product или как Service, единственное различие между ними - только метки полей во время просмотра.
поэтому я создаю два класса:
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, чтобы изменить классы этих двух провайдеров на основе данных модели? (например, в: OnActionExecuting или что-то еще?)
1 ответ
Вы можете написать собственный поставщик метаданных модели. Например, вы можете взглянуть на MvcExtensions. Они реализовали такого поставщика, чтобы иметь возможность динамически связывать метаданные с данным типом во время выполнения. Тот же метод используется FluentValidation.NET.