Настраиваемая пользователем проверка с метаданными, сохраненными в базе данных

Я работаю над приложением, которое должно проверить модель на основе некоторых метаданных, сохраненных в базе данных. Цель этого - позволить администраторам изменить способ проверки некоторых моделей без изменения кода в зависимости от предпочтений клиентов. Изменения применяются ко всему приложению, а не к конкретным пользователям, обращающимся к нему. Как это изменилось, не имеет значения в данный момент. Они могут быть изменены непосредственно в базе данных или с помощью приложения. Идея в том, что они должны быть настраиваемыми.

Допустим, у меня есть модель "Персона" со свойством "Имя" типа "строка".

public class Person
{
    public string Name { get; set; }
}

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

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

Кроме того, было бы неплохо работать с проверкой jquery и иметь как можно меньше запросов к базе данных (/service). Кроме того, я не могу использовать любой известный ORM, как EF.

1 ответ

Решение

Вы можете создать собственный атрибут проверки, который проверяет, проверяя метаданные, хранящиеся в базе данных. Пользовательские атрибуты проверки легко создавать, просто расширять System.ComponentModel.DataAnnotations.ValidationAttribute и переопределить IsValid() метод.

Чтобы получить клиентские правила, которые работают с проверкой jQuery, вам нужно будет создать настраиваемый адаптер для типа настраиваемого атрибута проверки, который расширяется System.Web.Mvc.DataAnnotationsModelValidator<YourCustomValidationAttribute>, Затем этот класс должен быть зарегистрирован в OnApplicationStart() метод вашего Global.asax,

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(YourCustomValidationAttribute), typeof(YourCustomAdapter));

Вот пример адаптера:

public class FooAdapter : DataAnnotationsModelValidator<FooAttribute>
{
    /// <summary>
    /// This constructor is used by the MVC framework to retrieve the client validation rules for the attribute
    /// type associated with this adapter.
    /// </summary>
    /// <param name="metadata">Information about the type being validated.</param>
    /// <param name="context">The ControllerContext for the controller handling the request.</param>
    /// <param name="attribute">The attribute associated with this adapter.</param>
    public FooAdapter(ModelMetadata metadata, ControllerContext context, FooAttribute attribute)
        : base(metadata, context, attribute)
    {
        _metadata = metadata;
    }

    /// <summary>
    /// Overrides the definition in System.Web.Mvc.ModelValidator to provide the client validation rules specific
    /// to this type.
    /// </summary>
    /// <returns>The set of rules that will be used for client side validation.</returns>
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationRequiredRule(
            String.Format("The {0} field is invalid.", _metadata.DisplayName ?? _metadata.PropertyName)) };
    }

    /// <summary>
    /// The metadata associated with the property tagged by the validation attribute.
    /// </summary>
    private ModelMetadata _metadata;
}

Это также может быть полезно, если вы хотите асинхронно вызывать проверку на стороне сервера http://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute(v=vs.108).aspx

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