Часть 22.5 – Провайдер конфигурации Модели. Свои правила

Завершим разработку провайдера конфигурации создав правила для пользовательских атрибутов.

Поддержка пользовательских атрибутов

Поддержка атрибута [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);
        }
    }
}

Реализацию на этом можно считать почти завершенной. Осталось только добавить созданные провайдеры метаданных и правил к провайдеру конфигурации. А затем применить его в создаваемом демонстрационном веб-приложении. >>

Pingbacks and trackbacks (2)+

Добавить комментарий