Пользовательская проверка ValidationAttribute и Blazor
# Все на заказ
Как вы, наверное, заметили во всех моих постах, я действительно стараюсь держать все как можно более чистым, поскольку я уже писал посты, касающиеся пользовательских атрибутов, пользовательской обработки исключений, внедрения коллекций сервисов и т. д.
Со временем я понял, что такой способ кодирования дает мне и моей команде возможность совершенствоваться со временем, легче находить проблемы и максимально разделять код.
Да, после этой крутой истории, которую я только что рассказал вам, в последнее время я, как обычно, работаю над 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 или другого приложения.
Надеюсь, вам понравилось. Если у вас есть какие-либо вопросы или вы хотите связаться со мной, не стесняйтесь и свяжитесь со мной!