Аннотации данных ASP.NET MVC 2 в динамически сгенерированной модели

Я создаю приложение asp.net mvc 2, динамически генерирующее мою модель представления в зависимости от ввода пользователя. Проще говоря, пользователь может выбрать, какие поля он хочет видеть в своем представлении.

Поскольку шаблонные помощники в значительной степени полагаются на свойства и атрибуты модели (аннотации данных), мне нужно было бы каким-то образом добавить атрибуты в модель представления во время выполнения. Не нужно говорить, что это непростая задача.

Итак, что вы, ребята, порекомендуете мне сделать в этом сценарии? Я не могу добавлять атрибуты статически, поэтому следует ли мне продолжить и попытаться добавить их динамически, даже если это большая работа, или я должен попытаться использовать другой подход?

Заранее спасибо!

Фелипе


person Felipe Lima    schedule 13.02.2010    source источник


Ответы (3)


Настраиваемая подшивка модели поможет вам только в части привязки. Это не поможет с шаблонными помощниками или другими функциями ASP.NET MVC.

Я рекомендую вместо этого написать собственный поставщик метаданных, унаследовав его от ModelMetadataProvider и зарегистрировать вашего провайдера в global.asax с помощью ModelMetadataProviders. Пользовательский поставщик метаданных может получать свои метаданные откуда угодно: из атрибутов CLR, XML-файла, базы данных или генератора случайных чисел. Встроенный провайдер аннотаций к данным, конечно же, использует атрибуты CLR.

Возможно, вы захотите взглянуть на исходный код для встроенного поставщика метаданных Data Annotations, чтобы увидеть пример того, как реализовать поставщика. Вы можете загрузить исходный код ASP.NET MVC 2 RC 2 с сайта CodePlex. Также может быть реализация в проекте MVC Futures, но я не уверен.

person Eilon    schedule 13.02.2010

Похоже, вам понадобится настраиваемый связыватель модели представления, который динамически применяет проверку.

person Donald Byrd    schedule 13.02.2010

Звучит как излишество (если я правильно понимаю) - создание моделей на лету. Вы не используете главное преимущество наличия моделей; проверки времени компиляции.

Я бы попытался использовать объекты, специфичные для задачи (например, класс UserForm, который будет иметь список классов UserFormFields и т. Д.), А не создавать их на лету.

Изменить: я предлагаю не использовать проверку на основе атрибутов и проектировать свою модель с учетом проверки. Дизайн, подобный приведенному ниже, может лучше объяснить мою точку зрения:

interface IUserValidation
{
    bool IsValid();
}

class RequiredUserValidation : IUserValidation
{
    public bool IsValid()
    {
        // ....
    }
}

class UserFormField
{
    List<IUserValidation> _validations;

    public IEnumerable<ValidationResult> Validate()
    {
       // ...
    }
}
person ziya    schedule 13.02.2010
comment
Примерно так выглядит моя модель. Коллекция полей, содержащих данные. Проблема в том, что у меня нет информации об этих полях во время компиляции. Мне нужно запросить базу данных и получить информацию из полей, и они заполнят свои атрибуты - person Felipe Lima; 13.02.2010