2012-08-28 15 views
12

Mam następujący kod działaMVC 4 - DataAnnotations - Validation dla typu

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

Gdy strona jest złożony z Cena = komunikat o błędzie jest puste pole „Cena jest wymagane.”. Cena = ponad 9999 komunikat o błędzie to "Cena xx.xx".

Jednak po wpisaniu "aaaa" komunikat o błędzie to "Produkt polaCena musi być liczbą."

Jak mogę zmienić komunikat, jeśli wpisz niepoprawny? odczuwalna:. „Cena musi być dziesiętną/liczba pomiędzy 1-9999

---- UPDATE: ---- Poniższy kod pracował z

NULL, a nie po przecinku, Między Range, , ale nie działa z”.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; } 

Odpowiedz

12

można spróbować z wyrażenia regularnego.

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

ty ca n także spróbować dane adnotacji rozszerzeń: http://dataannotationsextensions.org/Home/Wiki

lub wyraź swoją realizację, coś takiego: https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

UPDATE Z regex (mecze $ 9,999.99 | 0,70 USD | .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.")] 

lub za pomocą przedziału z niewielkimi zmianami do @Martin sugestii (w rzeczywistości jest to lepsze rozwiązanie):

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

To wyrażenie regularne nie powiedzie się w różnych przypadkach takich ".1" Nie polecam używania wyrażeń regularnych do pomijania liczb. wyrażenia regularne służą do dopasowywania ciągów znaków (tekstu). RangeAttribute jest najbardziej odpowiednim sposobem rozwiązania tego problemu. –

+0

@JOBG, jak powiedział Martin, ".1" NIE jest przechwycony przez jedną z (3) DataAnnotations. jakieś pomysły? –

+0

Po prostu zmień metodę @MartinDevillers Range z zakresu od 1-999 do 0-999 i powinieneś podać ".1", ponieważ powiedziałem, że Range jest lepszym rozwiązaniem. Dodałem również wyrażenie regularne na wypadek, gdybyś chciał to sprawdzić. – JOBG

5

Po pierwsze, myślę, że będzie chciał zmienić atrybut Zasięg do

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

According to MSDN, jest to ważny sposób na wykorzystanie RangeAttribute.

drugie:

"The productPrice pole musi być liczbą."

To naprawdę niezauważalna weryfikacja JavaScript po stronie klienta. Twój weryfikator zasięgu uruchomi się po zweryfikowaniu numeru. Można wyłączyć numer walidator choć nie jest to zalecane:

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

Nie będzie sprawdzania poprawności ciągów z początkową cyfrą 0, na przykład 0007, 0500 – mko

0

myślę, że może być potknięcia błąd w jQuery. Ta walidacja walczy z materiałem emitowanym dla twoich atrybutów sprawdzania poprawności.

Mam następującą właściwość:

[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; } 

używany w widoku tak:

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

prostu sama wartość "foo" daje mój komunikat o błędzie. Przyjmuje się wartość 0,075. Wartość 0,075 daje "Wartość pola musi być liczbą", ten sam problem, który wydaje się mieć.

podstawie this SO article, dodałem następujące w dokumencie gotowe:

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

Teraz mam tylko mój komunikat o błędzie, a dopiero gdy oczekiwano (0,075 jest akceptowana).