Настраиваемая пользователем проверка с метаданными, сохраненными в базе данных
Я работаю над приложением, которое должно проверить модель на основе некоторых метаданных, сохраненных в базе данных. Цель этого - позволить администраторам изменить способ проверки некоторых моделей без изменения кода в зависимости от предпочтений клиентов. Изменения применяются ко всему приложению, а не к конкретным пользователям, обращающимся к нему. Как это изменилось, не имеет значения в данный момент. Они могут быть изменены непосредственно в базе данных или с помощью приложения. Идея в том, что они должны быть настраиваемыми.
Допустим, у меня есть модель "Персона" со свойством "Имя" типа "строка".
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