изменение атрибута MetadataType viewmodel во время выполнения - PullRequest
6 голосов
/ 25 декабря 2011

В 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 или что-то еще?)

1 Ответ

5 голосов
/ 25 декабря 2011

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

...