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

У меня есть веб-форма, в которой пользователь должен ввести номер порта. Конечно, лучший тип для номера порта — 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.), и я не знаю, как его локализовать.

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


person Yevheniy Tymchishin    schedule 28.05.2019    source источник
comment
Это то что мне нужно > stackoverflow.com/questions/40828570/   -  person Yevheniy Tymchishin    schedule 29.05.2019


Ответы (2)


Попробуйте использовать 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; }
person Ryan    schedule 29.05.2019
comment
но я все еще могу использовать шрифт ushort, верно? И просто поймать исключение синтаксического анализа. - person Yevheniy Tymchishin; 29.05.2019
comment
Не могли бы вы четко объяснить, что вы хотите сделать в вашем случае? Что вы имеете в виду под localize сообщением об ошибке? Где вы видите сообщение? - person Ryan; 29.05.2019
comment
см. мой комментарий к основному вопросу. - person Yevheniy Tymchishin; 29.05.2019

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

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

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

person Augusto Diaz    schedule 29.05.2019