रेंज डेटा एनोटेशन विशेषता का उपयोग करके एक मिनट लेकिन कोई अधिकतम दशमलव कैसे निर्दिष्ट करें?


150

मैं यह निर्दिष्ट करना चाहूंगा कि कीमत के लिए एक दशमलव क्षेत्र होना चाहिए> = 0 लेकिन मैं वास्तव में एक अधिकतम मूल्य लागू नहीं करना चाहता।

यहाँ मेरे पास अभी तक क्या है ... मुझे यकीन नहीं है कि ऐसा करने का सही तरीका क्या है।

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

निश्चित रूप से अगर यह एक डेटाबेस में जा रहा है तो आपको चयनित डेटाबेस प्रकार के आधार पर अधिकतम अनुमत संख्या निर्दिष्ट करने की आवश्यकता होगी? अन्यथा यह संख्या अधिक होने पर आपको एक बुरा अपवाद मिलेगा
Coops

जवाबों:


226

इस जैसे किसी और के बारे में क्या राय है:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

आपको वही करना चाहिए जो आप ढूंढ रहे हैं और आप तार का उपयोग करने से बच सकते हैं।


1
मैंने इसे Int32 (Int32.MaxValue) के लिए उपयोग किया है और यह ठीक है, धन्यवाद!
ब्रोनक

15
हालांकि यह एक मूर्खतापूर्ण सत्यापन संदेश दिखाता है :(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
पायोटर कुला

16
@ppumkin Använd ErrorMessage, अर्थात [श्रेणी (0.0, Double.MaxValue, ErrorMessage = "आपकी त्रुटि यहाँ")]
फ़्लाफ़्लफ़

धन्यवाद जैकब। बहुत बढ़िया जवाब!
पेमब्राउवर्स

1
त्रुटि संदेशों को अनुकूलित करने के लिए DataAnnotationsModelValidator वर्ग से @ppumkin विरासत
अलेक्जेंडर

91

यदि आप स्ट्रिंग के बारे में चिंतित हैं तो अच्छा लग रहा है कि आप ऐसा कर सकते हैं:

    [Range(0, Double.PositiveInfinity)]

यह एक डिफ़ॉल्ट त्रुटि संदेश होगा:

इस तरह केAndSuch क्षेत्र 0 और इन्फिनिटी के बीच होना चाहिए।


11
यह यहाँ सबसे अच्छा जवाब है IMHO, कोई एक्सटेंशन नहीं, कोई प्रतीत नहीं यादृच्छिक स्ट्रिंग्स / संख्या, कोई कस्टम कोड और एक यथोचित सनसनीखेज त्रुटि संदेश।
विटनी

42

ऐसा लगता है कि मैन्युअल रूप से अधिकतम मूल्य में रखने के अलावा कोई विकल्प नहीं है। मैं उम्मीद कर रहा था कि कुछ प्रकार के अधिभार हैं जहां आपको एक निर्दिष्ट करने की आवश्यकता नहीं थी।

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

14
यह कोड सिर्फ भयानक लग रहा है। मैं nuget के माध्यम से dataannotationsextensions.org का उपयोग करने का सुझाव दूंगा और जैसा @Nicolai Schlenzig ने उत्तर दिया। उपयोग [Min(0)]- यह भी एक बेहतर सत्यापन संदेश है। मैं आपके उत्तर को अपडेट करने का सुझाव दूंगा
पिओट्र कुला

मैंने इसे अद्यतन करने के लिए इसे यहाँ सबसे अच्छे उत्तर के रूप में बनाया, क्योंकि ओपी अपना दिमाग नहीं बदल रहा है
वर्थ

उपरोक्त उत्तर (@ जोर्डन और @ जैकोब) अधिक उपयुक्त हैं। खासकर जब से हम प्राइस के बारे में बात कर रहे हैं। मैं समझता हूं कि कई बार लेन-देन दशमलव मानों के साथ करना पड़ता है, लेकिन इसकी कोई कीमत नहीं होती है। 1.234 डॉलर या कम से कम अधिकतर बार आप इसे उपयोगकर्ता को दिखाना नहीं चाहते हैं।
अनास्तासिया सेलमैनिस

@AnastasiosSelmanis, मैं आपसे सहमत हूं, जब आप कहते हैं कि भाग की उम्मीद करें "लेकिन कोई कीमत 1.23 लाख डॉलर नहीं है"। आप USD मान रहे हैं, और तब भी, जब आप विदेशी मुद्रा के लिए इसका उपयोग करते हैं (हालांकि ओपी द्वारा यहां उल्लेख नहीं किया गया है), USD अधिक दशमलव में जाता है। =)
RoLYroLLs

35

आप उपयोग कर सकते हैं:

[Min(0)]

यह आवश्यक न्यूनतम मान 0 (शून्य) और कोई अधिकतम मूल्य नहीं लगाएगा।

इसका उपयोग करने के लिए आपको DataAnnotationsExtensions की आवश्यकता है ।


8
नहीं, मुझे नहीं लगता कि यह सही है। यह मानक एमवीसी 3 ढांचे का हिस्सा नहीं है, यह डेटा एनोटेशन एक्सटेंशन्स dataannotationsextensions.org से है । कृपया MSDN लिंक प्रदान करें।
बर्नी व्हाइट

1
NO - निश्चित रूप से MVC 3 का हिस्सा नहीं है :( BUt कि पुस्तकालय किसी भी तरह से एक अच्छा विस्तार है :)
Piotr Kula

1
MVC3 का हिस्सा नहीं है लेकिन यह महत्वपूर्ण नहीं है। यदि आप क्लाइंट की ओर से सत्यापन चाहते हैं, तो आपको केवल DataAnnotationsExtensions.MVC3 पैकेज का उपयोग करने की आवश्यकता है। ये दोनों पैकेज नगेट पर उपलब्ध हैं। मुझे लगता है कि यह सबसे अच्छा तरीका है, क्योंकि आपके पास एक बेवकूफ त्रुटि संदेश नहीं है या हर बार जब आप सकारात्मक पूर्णांक या दशमलव (जो कि काफी सामान्य है) को मान्य करना चाहते हैं, तो त्रुटि संदेश को फिर से परिभाषित करने की आवश्यकता नहीं है।
जेंटिएन

21

यदि आप कीमतों के साथ काम कर रहे हैं, तो मुझे यकीन है कि आप सुरक्षित रूप से मान सकते हैं कि कुछ भी 1 ट्रिलियन डॉलर से अधिक खर्च नहीं होगा।

मैं उपयोग करूँगा:

[Range(0.0, 1000000000000)]

या यदि आपको वास्तव में इसकी आवश्यकता है, तो Decimal.MaxValue(अल्पविराम के बिना) के मूल्य में पेस्ट करें:79,228,162,514,264,337,593,543,950,335

अगर आप जिम्बाब्वे से नहीं हैं, तो इनमें से कोई एक अच्छा काम करेगा।


7
सिर्फ क्यों नहीं [Range(0.0,Decimal.MaxValue)]?
Coops

4
संकलन नहीं होगा, Decimal.MaxValue एक स्थिर नहीं है।
जॉन फैरेल

यह निरंतरता एक उपद्रव है, त्रुटि पाठ के लिए एक संसाधन फ़ाइल का जिक्र करना आसान नहीं है
Coops

3
अब आप यह धारणा बना रहे हैं कि मुद्रा डॉलर है, येन या कुछ और।
फ्रेड

1
@ जफर डेसीमल.मैक्सवेल्यू एक स्थिर है। यह सिर्फ इतना है कि एक दशमलव को समायोजित करने के लिए रेंज में कोई अधिभार नहीं है।
18 Г И О И О

11

आप कस्टम सत्यापन का उपयोग कर सकते हैं:

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

सत्यापन के तरीके प्रकार:

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}

2

मैं कुछ इस तरह की कोशिश करने जा रहा था:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

हालांकि, ऐसा करने के साथ समस्या यह है कि संकलक एक निरंतर अभिव्यक्ति चाहता है, जो अस्वीकार करता है ((double)0).ToString()। कंपाइलर ले जाएगा

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

जो कोई भी इसे कम करेगा, कृपया बताएं कि आपको क्यों लगता है कि मेरा समाधान खराब है या सहायक नहीं है? क्योंकि किसी भी स्पष्टीकरण के बिना बस downvoting पूरी तरह से unhelpful है।
डेविड टी। मैकनेट सेप

आपका त्रुटि संदेश "से अधिक या बराबर" कहना चाहिए।
18 Г И О И О

अच्छी पकड़। जोड़ा गया।
डेविड टी। मैकनेट

1

के साथ रेंज का उपयोग कर

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

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

आशा है कि यह मदद करेगा



0

मैं decimal.MaxValue.ToString()लगाता हूं क्योंकि यह डेस्मियल प्रकार के लिए प्रभावी छत है, यह एक ऊपरी बाध्य नहीं होने के बराबर है।


4
समस्या यह है कि एक स्थिर नहीं है। आपको यह त्रुटि मिलेगी: एक विशेषता तर्क एक निरंतर अभिव्यक्ति, टाइपो अभिव्यक्ति या विशेषता पैरामीटर प्रकार की सरणी निर्माण अभिव्यक्ति होना चाहिए
user169867

जैसा कि मैंने नीचे बताया है, लेकिन जाहिर तौर पर यह किसी की सराहना नहीं थी।
बजे डेविड टी। मैकनेट सेप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.