Изменение атрибута 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.

Другие вопросы по тегам