ASP.NET MVC 2 Аннотации данных в динамически генерируемой модели - PullRequest
8 голосов
/ 13 февраля 2010

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

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

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

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

Фелипе

Ответы [ 3 ]

3 голосов
/ 13 февраля 2010

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

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

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

0 голосов
/ 13 февраля 2010

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

0 голосов
/ 13 февраля 2010

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

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

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

interface IUserValidation
{
    bool IsValid();
}

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

class UserFormField
{
    List<IUserValidation> _validations;

    public IEnumerable<ValidationResult> Validate()
    {
       // ...
    }
}
...