Подтвердить что ты не робот

MVC 4 - DataAnnotes - проверка для типа

У меня работает следующий код

    [Required(ErrorMessage = "Price is required.")]
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price xx.xx")]
    public decimal? productPrice { get; set; }

Когда страница отправляется с Price = EMPTY Полевое сообщение об ошибке "Цена требуется". Price = более 9999 сообщение об ошибке "Цена xx.xx".

Однако, когда я печатаю 'aaaa', сообщение об ошибке "Полевой продуктЦена должна быть числом.

Как я могу изменить сообщение, если тип не правильный? Например: "Цена должна быть десятичной/число между 1-9999.

---- UPDATE: ---- Код ниже работал с

NULL, а не десятичный, между диапазонами, но не работает с ".1".

    [Required(ErrorMessage = "Price is required.")]
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Price must be a Numbers only.")]
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price must be a decimal/number between {1} and {2}.")]
    public decimal? productPrice { get; set; }
4b9b3361

Ответ 1

Вы можете попробовать с регулярным выражением:

[RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "{0} must be a Number.")]

вы также можете попробовать расширения аннотаций данных: http://dataannotationsextensions.org/Home/Wiki

Или напишите свою собственную реализацию, примерно так: https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

UPDATE С REGEX (соответствует $9,999.99 | $0.70 |.1)

[RegularExpression(@"^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$", ErrorMessage = "{0} must be a Number.")]

Или используя Range с небольшой модификацией предложения @Martin (на самом деле это лучшее решение):

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]

Ответ 2

Во-первых, я думаю, вам нужно изменить атрибут Range на

[Range(typeof(Decimal), "1", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]

Согласно MSDN, это действительный способ использования RangeAttribute.

Во-вторых:

"Полевой продуктЦена должна быть числом."

На самом деле это ненавязчивая проверка на основе JavaScript на стороне клиента. Ваш валидатор диапазона будет срабатывать после того, как номер будет проверен. Вы можете отключить валидатор чисел, хотя я не рекомендую это:

$.validator.methods.number = function (n, t) {
    return true;
}

Ответ 3

Я думаю, что вы можете споткнуться об ошибке в jQuery. Эта проверка ведет борьбу с материалом, испускаемым для ваших атрибутов проверки.

У меня есть следующее свойство:

[Display(ResourceType = typeof(TaxSetupResources), Name = "Model_Value")]
[RegularExpression(@"(^\d+$)|(^\.\d{1,4}$)|(^\d*\.\d{0,4}$)", ErrorMessageResourceName="Model_InvalidFormatForAmount", ErrorMessageResourceType=typeof(TaxSetupResources))]
public decimal? Value { get; set; }

Используется в виде следующего вида:

<div>
    @Html.TextBoxFor(t => t.Tiers[i].Value, new { title = @Resources.TaxSetupResources.Model_ValueTip })
    <br />@Html.ValidationMessageFor(t => t.Tiers[i].Value)
</div>

Само по себе значение "foo" дает мое сообщение об ошибке. Принимается значение 0,075. Значение 0,75 дает "Значение поля должно быть числом", то же самое, что вы, похоже, имеете.

на основе этой статьи SO, я добавил следующее в документе:

$(function () {
    $.validator.methods.number = function (value, element) {
        return parseFloat(value).toString() !== "NaN";
    }
});

Теперь я получаю только сообщение об ошибке и только тогда, когда ожидается (.075).