Как локализовать сообщение проверки по умолчанию для свойств типа значения (ushort), если значение выходит за границы типа? - PullRequest
0 голосов

У меня есть веб-форма, где пользователь должен ввести номер порта. Конечно, лучший тип номера порта - это ushort. Я использую RangeAttribute для проверки номера порта и некоторых сообщений об ошибках.

[Required(ErrorMessage = "The field is required")]
[Display(Name = "Port")]
[Range(1, ushort.MaxValue, ErrorMessage = "Invalid value")]
public ushort Port { get; set; }

Локализация работает правильно, только если я ввожу значения от 0 до 65535. Таким образом, есть только один неправильный случай - нулевое значение. Но если я пытаюсь сохранить пустое значение, ввести отрицательные значения или значения, превышающие 65535, я получу совершенно другое сообщение об ошибке (The value '-1' is not valid for Port.) и не знаю, как его локализовать.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Попробуйте использовать int и пользовательский атрибут проверки, например

public class PortPolicy : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if ((int)value >= 1 && (int)value <= 65535)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("Invalid value");
        }
    }
}

Модель:

[Required(ErrorMessage = "The field is required")]
[Display(Name = "Port")]
[PortPolicy]
public int Port { get; set; }
0 голосов
/ 29 мая 2019

Самый простой способ - использовать short (или больший тип со знаком) вместо ushort, процесс привязки модели происходит после проверки модели, поэтому, поскольку значение -1 несовместимо с ushort процессом остановится на этом, и ваша пользовательская ошибка никогда не будет прочитана.

Сложный путь - написать свой собственный валидатор модели:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-2.2#custom-attributes

...