Пользовательская проверка номера не работает должным образом, когда значение не является числом - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть пользовательская проверка, которая проверяет другое поле, а затем определяет, находится ли рассматриваемое поле в определенном диапазоне номеров. Он отлично работает всякий раз, когда пользователь вводит число. Однако, если пользователь передает не-число, это не-число (параметр value) не передается в валидацию. Вместо этого null передается на проверку. Я бы предпочел, чтобы число с запятыми передавалось. Вместо этого пользователю представляется загадочный символ "The value XXX is not valid for XXX, который не помогает. Я также получил аннотации данных [Required] и [Numeric] в этом поле. Они обычно ловят любые проблемы. Однако, если пользователь введет правильный номер с запятой, значение не будет передано в мою пользовательскую проверку. Я не уверен, где проблема происходит. Какие-нибудь мысли? Я попытался удалить запятые с помощью javascript, но значение, передаваемое моей пользовательской проверке, все еще равно нулю. Вот моя пользовательская проверка, которая называется:

public sealed class RequiresRangeAmount : ValidationAttribute
{
    public RequiresRangeAmount(string property)
    {
        Property = property;
    }

    public string Property { get; set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectType.GetProperty(Property);

        if (property != null)
        {
            var loanSubType = (int)property.GetValue(validationContext.ObjectInstance, null);

            if (loanSubType == LoanSubTypeConstants.Visa|| loanSubType == LoanSubTypeConstants.Visa2)
            {
                var valueConverted = Convert.ToDecimal(value);
                if (valueConverted < 5000 || valueConverted > 75000)
                {
                    return new ValidationResult(ErrorMessage);
                }
            }
        }

        return null;
    }
}

Вот используется:

[Required]
[Numeric]
[RequiresRangeAmount("LoanSubType", ErrorMessage = "A VISA must be in XXX range.")]
[DisplayName("Requested Loan Amount")]
public decimal? RequestedAmount { get; set; }

Внешний интерфейс для удаления запятых не помогает:

$("#mainForm").submit(function() {
    var strippedCommasAmount = $("#RequestedAmount").val().replace(/,/g, '');
    $("#RequestedAmount").val(strippedCommasAmount);
});

1 Ответ

0 голосов
/ 14 ноября 2018

не знаю, поможет ли это, но у меня есть функция, которую я сейчас использую во всех своих проектах:

public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = '.')
        {
            string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value;

            if (tmp.Length > 0 && strToParse.Contains(tmp))
            {
                var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator;

                tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator);
                return double.Parse(tmp);
            }

            return double.NegativeInfinity;
        }

1-й, он работает независимо от культуры компьютера (500,5 или 500,5)

2-й, если пользователь вводит что-то, что не является числом, вы просто возвращаете NegativeInfinite, поэтому вам просто нужно проверить, не равно ли возвращенное значение NegativeInfinity, чтобы узнать, является ли значение правильным или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...