2012-08-28 14 views
12

के लिए मान्यता मैं निम्नलिखित कोड काम कर रहा हैMVC 4 - DataAnnotations - प्रकार

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

पेज मूल्य के साथ प्रस्तुत किया जाता है तो = खाली क्षेत्र त्रुटि संदेश है "मूल्य की आवश्यकता है।"। मूल्य = 99 99 से अधिक त्रुटि संदेश "मूल्य xx.xx" है।

हालांकि, जब मैं 'aaaa' टाइप करता हूं तो त्रुटि संदेश "फ़ील्ड उत्पादप्रस एक संख्या होना चाहिए।"

यदि सही नहीं है तो मैं संदेश कैसे बदल सकता हूं? की तरह:। "मूल्य 1-9999 के बीच एक दशमलव/संख्या होनी चाहिए

---- अद्यतन: ---- नीचे कोड, साथ

शून्य, नहीं दशमलव काम रेंज के बीच, लेकिन ".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; } 

उत्तर

12

आप नियमित अभिव्यक्ति के साथ की कोशिश कर सकते हैं:।

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

आप ca n भी डाटा एनोटेशन एक्सटेंशन का प्रयास करें: http://dataannotationsextensions.org/Home/Wiki

या अपनी कार्यान्वयन, कुछ इस तरह लिखना: https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

अद्यतन 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.")] 

या @Martin सुझाव के एक मामूली संशोधन के साथ रेंज का उपयोग कर (वास्तव में है:

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

यह नियमित अभिव्यक्ति विभिन्न मामलों में विफल हो जाएगी जैसे ".1" मैं संख्याओं को क्रंच करने के लिए नियमित अभिव्यक्तियों का उपयोग करने की अनुशंसा नहीं करता हूं। नियमित अभिव्यक्ति तारों (पाठ) इनपुट से मेल खाने के लिए हैं। इस समस्या को हल करने के लिए RangeAttribute सबसे उपयुक्त तरीका है। –

+0

@ जेओबीजी ने मार्टिन के रूप में कहा, ".1" किसी भी (3) डेटा एन्नोटेशन द्वारा पकड़ा नहीं जा रहा है। कोई विचार? –

+0

बस @MartinDevillers रेंज विधि को 1-99 9 से 0-999 तक बदलें और इसे ".1" पास करना चाहिए, जैसा कि मैंने कहा था कि वास्तव में रेंज एक बेहतर समाधान है। यदि आप इसके साथ जांच करना चाहते हैं तो मैंने एक रेगेक्स भी जोड़ा। – JOBG

5

सबसे पहले, मुझे लगता है कि आप करने के लिए अपने रेंज विशेषता बदलना चाहते हैं जाएगा

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

According to MSDN, यह श्रेणी एट्रिब्यूट का उपयोग करने का एक वैध तरीका है।

दूसरा:

"क्षेत्र productPrice एक संख्या होनी चाहिए।"

यह वास्तव में अविभाज्य क्लाइंट-साइड जावास्क्रिप्ट सत्यापन में लात मार रहा है। संख्या के सत्यापन के बाद आपकी सीमा वैधता आग लग जाएगी। आप नंबर सत्यापनकर्ता निष्क्रिय कर सकते हैं, हालांकि मैं इस अनुशंसा नहीं करते हैं:

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

यह अंक 0 से शुरुआती अंकों के साथ तारों को मान्य नहीं करेगा, जैसे 0007, 0500 – mko

0

मुझे लगता है कि आप 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 स्वीकार किया जाता है। .075 उपज का एक मूल्य "फ़ील्ड मान एक संख्या होना चाहिए", वही समस्या जो आपको लगता है।

पर this SO article आधारित, मैं दस्तावेज़ तैयार में निम्नलिखित कहा:

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

अब मैं सिर्फ अपने त्रुटि संदेश मिलता है, और केवल जब उम्मीद (0.075 स्वीकार किया जाता है)।

संबंधित मुद्दे