20250420
This commit is contained in:
118
anbs_cpfn/Classes/CustomValidationMessages.cs
Normal file
118
anbs_cpfn/Classes/CustomValidationMessages.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
using anbs_cp.Classes;
|
||||
using anbs_cp.ForNet.Constants;
|
||||
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
|
||||
|
||||
namespace anbs_cp.ForNet.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Кастомные сообщения валидации формы
|
||||
/// </summary>
|
||||
/// <param name="messageList">Кастомный список сообщений формы</param>
|
||||
public class CustomValidationMessages (KeyValueOrderedList<string>? messageList): IValidationMetadataProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Список сообщений формы
|
||||
/// </summary>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public readonly KeyValueOrderedList<string> MessageList = messageList ?? ValidationMessagesConstants.English;
|
||||
|
||||
/// <summary>
|
||||
/// Создаёт данные для локализации сообщений валидации
|
||||
/// </summary>
|
||||
/// <param name="context">Контекст</param>
|
||||
public void CreateValidationMetadata (ValidationMetadataProviderContext context)
|
||||
{
|
||||
// Если context = null, то прерываем с ошибкой
|
||||
ArgumentNullException.ThrowIfNull(context);
|
||||
|
||||
// Получаю мета-данные
|
||||
IList<object>? validators = context.ValidationMetadata.ValidatorMetadata;
|
||||
|
||||
// Получаю тип модели
|
||||
Type? theType = context.Key.ModelType;
|
||||
|
||||
// Получаю фундаментальный тип
|
||||
Type? underlyingType = Nullable.GetUnderlyingType(theType);
|
||||
|
||||
// Проверяю получение и соответствие
|
||||
if (theType.IsValueType && underlyingType == null &&
|
||||
validators.All(m => m.GetType() != typeof(RequiredAttribute)))
|
||||
// - задаю валидацию
|
||||
validators.Add(new RequiredAttribute());
|
||||
|
||||
// Для каждого объекта валидации
|
||||
foreach (object? obj in validators)
|
||||
{
|
||||
// - если он не атрибут
|
||||
if (obj is not ValidationAttribute attribute)
|
||||
// -- то продолжаю
|
||||
continue;
|
||||
|
||||
// RequiredAttribute
|
||||
FillErrorMessage<RequiredAttribute>(attribute);
|
||||
|
||||
// MinLengthAttribute
|
||||
FillErrorMessage<MinLengthAttribute>(attribute);
|
||||
|
||||
// MaxLengthAttribute
|
||||
FillErrorMessage<MaxLengthAttribute>(attribute);
|
||||
|
||||
// EmailAddressAttribute
|
||||
FillErrorMessage<EmailAddressAttribute>(attribute);
|
||||
|
||||
// RangeAttribute
|
||||
FillErrorMessage<RangeAttribute>(attribute);
|
||||
|
||||
// CompareAttribute
|
||||
FillErrorMessage<CompareAttribute>(attribute);
|
||||
|
||||
// RegularExpressionAttribute
|
||||
FillErrorMessage<RegularExpressionAttribute>(attribute);
|
||||
|
||||
// PhoneAttribute
|
||||
FillErrorMessage<PhoneAttribute>(attribute);
|
||||
|
||||
// CreditCardAttribute
|
||||
FillErrorMessage<CreditCardAttribute>(attribute);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Устанавливает сообщение об ошибке валидации
|
||||
/// </summary>
|
||||
/// <typeparam name="T">Тип атрибута валидации</typeparam>
|
||||
/// <param name="attribute">Атрибут</param>
|
||||
private void FillErrorMessage<T> (object attribute) where T : ValidationAttribute
|
||||
{
|
||||
// Проверяю на соответствие типа
|
||||
if (attribute is not T validationAttribute)
|
||||
// - и прерываю, если не соответствует
|
||||
return;
|
||||
|
||||
// Если нет сообщения об ошибке
|
||||
if (validationAttribute.ErrorMessage == null && validationAttribute.ErrorMessageResourceName == null)
|
||||
{
|
||||
// - получаю имя аттрибута
|
||||
string attributeTypeName = typeof(T).Name;
|
||||
|
||||
// - если список сообщений не содержит ключа с таким именем аттрибута
|
||||
if (MessageList.Keys.All(s => s != attributeTypeName))
|
||||
// -- то прерываю
|
||||
return;
|
||||
|
||||
// - получаю предопределённое сообщение об ошибке
|
||||
string? errorMessage = MessageList.GetValue(attributeTypeName);
|
||||
|
||||
// - если предопределённое сообщение пусто
|
||||
if (errorMessage == null)
|
||||
// -- то прерываю
|
||||
return;
|
||||
|
||||
// - задаю значение
|
||||
validationAttribute.ErrorMessage = errorMessage;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user