Завершим разработку провайдера конфигурации создав правила для пользовательских атрибутов.
Поддержка пользовательских атрибутов
Поддержка атрибута [BlockHtml] – BlockHtmlRule
Атрибут [BlockHtml] был создан для блокировки ввода HTML элементов на стороне пользователя. Он не требует дополнительных параметров. Обратите внимание, что для всех пользовательских атрибутов в качестве возвращаемого значения будет использоваться generic-версия адаптера правил проверки данных DataAnnotationsModelValidator.
В папке Models\Configuration\Rules создадим класс BlockHtmlRule:
/// Copyright (c) 2011 Andrey Veselov. All rights reserved.
/// WebSite: http://andrey.moveax.ru
/// Email: andrey@moveax.ru
/// This source is subject to the Microsoft Public License (Ms-PL).
namespace MVCDemo.Models.Configuration.Rules
{
using System;
using System.Web.Mvc;
using System.Xml.Linq;
using MVCDemo.Attributes.Validation;
public class BlockHtmlRule : ModelValidatorRule
{
public override ModelValidator Create(
XElement xmlElement,
Type defaultResourceType,
ModelMetadata metadata,
ControllerContext context)
{
var attribute = new BlockHtmlAttribute();
this.BindErrorMessageToAttribte(attribute, xmlElement, defaultResourceType);
return new DataAnnotationsModelValidator<BlockHtmlAttribute>(metadata, context, attribute);
}
}
}
Поддержка атрибута [Equal] – EqualRule
Следующий атрибут [Equal] используется для сравнения введенного в поле значения с константой. Как следствие, для его установки необходимо указать два аргумента: значение value и его тип type.
В папке Models\Configuration\Rules создадим класс EqualRule:
/// Copyright (c) 2011 Andrey Veselov. All rights reserved.
/// WebSite: http://andrey.moveax.ru
/// Email: andrey@moveax.ru
/// This source is subject to the Microsoft Public License (Ms-PL).
namespace MVCDemo.Models.Configuration.Rules
{
using System;
using System.IO;
using System.Web.Mvc;
using System.Xml.Linq;
using MVCDemo.Attributes.Validation;
using MVCDemo.Models.Extensions;
public class EqualRule : ModelValidatorRule
{
public override ModelValidator Create(
XElement xmlElement,
Type defaultResourceType,
ModelMetadata metadata,
ControllerContext context)
{
string value = xmlElement.GetValueOrNull("value");
if (value == null) {
throw new InvalidDataException(
string.Format("The value was not set. Element: {0}", xmlElement));
}
string type = xmlElement.GetValueOrNull("type");
if (value == null) {
type = "System.Boolean";
}
var objectValue =
Convert.ChangeType (value, Type.GetType(type, throwOnError: true));
var attribute = new EqualAttribute(objectValue);
this.BindErrorMessageToAttribte(attribute, xmlElement, defaultResourceType);
return new DataAnnotationsModelValidator<EqualAttribute>(
metadata, context, attribute);
}
}
}
Поддержка атрибута [StringLengthRange] – StringLengthRangeRule
Последний из рассматриваемых атрибутов, которому необходимо реализовать поддержку, это [StringLengthRange]. В данном случае, как и при соз��ании поддержки для [Range], потребуются значения min и max. Однако при этом они обязательно должны быть типа Int32:
В папке Models\Configuration\Rules создадим класс StringLengthRangeRule:
/// Copyright (c) 2011 Andrey Veselov. All rights reserved.
/// WebSite: http://andrey.moveax.ru
/// Email: andrey@moveax.ru
/// This source is subject to the Microsoft Public License (Ms-PL).
namespace MVCDemo.Models.Configuration.Rules
{
using System;
using System.IO;
using System.Web.Mvc;
using System.Xml.Linq;
using MVCDemo.Attributes.Validation;
using MVCDemo.Models.Extensions;
public class StringLengthRangeRule : ModelValidatorRule
{
public override ModelValidator Create(
XElement xmlElement,
Type defaultResourceType,
ModelMetadata metadata,
ControllerContext context)
{
string min = xmlElement.GetValueOrNull("min");
if (min == null) {
throw new InvalidDataException(
string.Format(
"The min value was not set. Element: {0}", xmlElement));
}
string max = xmlElement.GetValueOrNull("max");
if (min == null) {
throw new InvalidDataException(
string.Format(
"The max value was not set. Element: {0}", xmlElement));
}
int minValue = Convert.ToInt32(min);
int maxValue = Convert.ToInt32(max);
var attribute = new StringLengthRangeAttribute(minValue, maxValue);
this.BindErrorMessageToAttribte(attribute, xmlElement, defaultResourceType);
return new DataAnnotationsModelValidator<StringLengthRangeAttribute>(
metadata, context, attribute);
}
}
}
Реализацию на этом можно считать почти завершенной. Осталось только добавить созданные провайдеры метаданных и правил к провайдеру конфигурации. А затем применить его в создаваемом демонстрационном веб-приложении. >>