Пользовательская проверка ValidationAttribute и Blazor

· 3 мин чтения

# Все на заказ

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

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

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

Да, это забавно, спустя столько лет…

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

На самом деле идея пришла из работы: мы всегда выполняем проверку во всех местах, но у меня были некоторые поля, которые требовали одного и того же процесса проверки, поэтому я подумал, что там может быть что-то… например, пользовательские атрибуты проверки!

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

public class StringLengthRangeAttribute : ValidationAttribute
{
    public int Minimum { get; set; }
    public int Maximum { get; set; }

    public StringLengthRangeAttribute()
    {
        this.Minimum = 0;
        this.Maximum = int.MaxValue;
    }

    public override bool IsValid(object value)
    {
        string strValue = value as string;
        if (!string.IsNullOrEmpty(strValue))
        {
            int len = strValue.Length;
            return len >= this.Minimum && len <= this.Maximum;
        }
        return true;
    }
}

и используйте его в простом классе, например:

[[[ТОК_1]]]

Пользовательский валидатор

Итак, у меня есть этот валидатор, который мне нужен для какого-то конкретного бизнес-кейса, который будет содержать 20 первых символов, которые будут дополнять 9 цифр и дефис и заканчиваться 2 символами, которые обычно будут кодом страны, что-то вроде этого: 123456789-123456789-ES

В итоге я пришел к чему-то вроде этого, это действительно просто, но работает:

[[[ТОК_2]]]

Тесты

Для них я тоже написал тест, на всякий случай:

[[[ТОК_3]]]

И когда я запустил, у меня были такие результаты:

[[[ТОК_4]]]

Пользовательская проверка и Blazor

Итак, теперь, когда я знаю, что его можно использовать, очевидно, что реализовать его в Blazor — хорошая идея, верно?

Предположим, у меня есть эта форма, которая будет использовать модель Person, которую я показывал ранее:

[[[ТОК_6]]]

Как только мы запустим это, мы получим следующие ошибки:

А если просто поставить то, что хотим, то получим следующую вещь, все понятно:

Честно говоря, для меня совершенно очевидно, что мы должны переместить логику, по крайней мере, для проверки этих форм, в пользовательские атрибуты проверки. Это дает нам свободу хранить код для этого входа в одном месте, и мы можем использовать его позже для API или другого приложения.

Надеюсь, вам понравилось. Если у вас есть какие-либо вопросы или вы хотите связаться со мной, не стесняйтесь и свяжитесь со мной!