2011-03-23 14 views
8

के साथ ASP.NET रेंज वैलिडेटर अजीबता मेरे पास कुछ इनपुट फ़ील्ड और सत्यापनकर्ताओं के साथ एक बहुत ही सरल ASP.NET पृष्ठ है। एक क्षेत्र इस तरह एक डबल दिखता को स्वीकार:अधिकतम Value

<asp:TextBox ID="tbHeight" runat="server" /> 
<asp:RangeValidator ID="vdHeight" runat="server" 
    ErrorMessage="Height must be a positive number" Text="*" 
    ControlToValidate="tbHeight" MinimumValue="0" Type="Double" /> 

यह उम्मीद काम करता है के रूप में, और उपयोगकर्ता एक नंबर> = 0.
अद्यतन दर्ज करना होगा: इस afterall की उम्मीद (कुछ अजीब बग के रूप में काम नहीं करता है परियोजना में)।

<asp:TextBox ID="tbGrossTonnage" runat="server" /> 
<asp:RangeValidator ID="vdGrossTonnage" runat="server" 
    ErrorMessage="Gross Tonnage must be a positive whole number" Text="*" 
    ControlToValidate="tbGrossTonnage" MinimumValue="0" Type="Integer" /> 

जब एएसपी-पेज लोड हो रहा है, यह मुझे निम्न त्रुटि देता है:: मूल्य 'नीचे दिए गए विवरण

के लिए मैं तो एक पूर्णांक को स्वीकार करने के लिए एक क्षेत्र के लिए एक ही कोशिश उत्तर देने के लिए टिप्पणियां देखें 'vdGrossTonnage' की अधिकतम वैल्यू प्रॉपर्टी को 'इंटीजर' प्रकार में परिवर्तित नहीं किया जा सकता है।

मैं प्रणाली में किसी भी विशिष्ट अधिकतम मूल्य आवश्यकताओं की जरूरत नहीं है, तो मैं बस की तरह होगा यह Int32.MaxValue लिए "डिफ़ॉल्ट" (करने के लिए हालांकि मैं स्वीकार करने के लिए नहीं लगता है, 2,147,483,647 में प्रवेश करने के बाद से MaximumValue होगा Int32.MaxValue निरंतर)।

ऐसा क्यों है कि प्रकार Integer एक लापता MaximumValue संपत्ति को स्वीकार नहीं करेगा की एक RangeValidator, लेकिन प्रकार Double में से एक के लिए यह ठीक है?

उत्तर

15

MinimumValue और MaximumValue गुण सेट नहीं है।

इसके बाद, यह भी होता है कि Convert() संरक्षित विधि BaseCompareValidator द्वारा कार्यान्वित, जो मूल्यों के लिए स्ट्रिंग गुण परिवर्तित करने के लिए प्रयोग किया जाता है, कहता है ValidationDataType.Integer मामले के लिए int.Parse()int.Parse() खाली स्ट्रिंग पसंद नहीं है और एक अपवाद फेंक देगा।

लेकिन, ValidationDataType.Double के मामले में, Convert() पहले कॉल कोई अन्य सुरक्षित विधि, ConvertDouble() (double.Parse() के बजाय), और कहा कि विधि में यह स्पष्ट रूप से "0" के एक स्ट्रिंग मान देता है कोई रिक्त स्ट्रिंग का पता चला है जब, और उस स्ट्रिंग मान "0" बाद में पार्स, double.Parse() के माध्यम से 0d में।

पूर्णांक मामले string.Empty के "0" के मैपिंग से लाभ नहीं उठाता है।

इसलिए, विकृति। शैतान विवरण में है, और Reflector आपका मित्र है।

+0

बस एक छोटा सा अनुवर्ती: यदि मैं डबल प्रकार के लिए 'अधिकतम वैल्यू' छोड़ देता हूं, तो इसका मतलब यह होगा कि न्यूनतम और अधिकतम दोनों 0 हैं। फिर मेरा पृष्ठ सही ढंग से फ़ील्ड को मान्य क्यों करता है (-1 अमान्य है, और 1 मान्य है (मैंने दोबारा जांच की है, और यह वास्तव में काम करता है))? – Nailuj

+0

@Nailuj मैं आपकी खोज की पुष्टि नहीं कर सकता कि पृष्ठ इनपुट के रूप में "1" के साथ सही ढंग से मान्य करता है। यदि मैं आपके नियंत्रण (उपरोक्त अपने पहले स्निपेट से) को एक खाली वेब साइट प्रोजेक्ट में एक नए पृष्ठ पर छोड़ देता हूं, तो "1" इनपुट करता है और फिर पोस्टबैक (मैंने एक बटन जोड़ा) * * सत्यापन सत्यापन विफलता का कारण बनता है। –

+0

यह सही ढंग से मान्य नहीं है। –

0

RangeValidator के लिए MaximumValue निर्दिष्ट करना सबसे अच्छा अभ्यास है, भले ही आपकी आवश्यकताएं विशेष रूप से किसी के लिए कॉल न करें। उस स्थिति में Type के लिए बस MaxValue का उपयोग करें। MaximumValue के लिए डिफ़ॉल्ट मान String.Empty है। RangeValidator वर्ग वापसी string.Empty उनके डिफ़ॉल्ट के रूप में की

1

टाइप = "डबल" पर अधिकतम वैल्यू रिक्त छोड़ना अधिकतम वैल्यू को 0 पर सेट करने के बराबर है। मुझे यकीन नहीं है कि आप अपने उदाहरणों में से पहले ठीक काम करने के बारे में सही हैं।

+0

स्वीकार नहीं करेगा हाँ, मैं * निश्चित हूं कि मेरा पहला उदाहरण ठीक काम करता है। मैंने इसे दोबारा जांच लिया है (क्रिस डब्ल्यू रे के जवाब पर मेरी टिप्पणी देखें)। – Nailuj

+0

@Nailuj मैंने आपके उदाहरण की कोशिश की और यह ठीक काम नहीं किया। (उपर्युक्त मेरी टिप्पणी देखें।) क्या आप एक नई वेब साइट प्रोजेक्ट में, अपने आवेदन के बाहर, सबसे सरल संभव कम मामले में फिर कोशिश कर सकते हैं, जैसा मैंने किया था? शायद आपके आवेदन में हस्तक्षेप से अन्य कोड है। जैसे क्या आप अपने किसी भी वैधकर्ता को चुनिंदा रूप से सक्षम/अक्षम करते हैं? इत्यादि –

+0

@ क्रिस डब्ल्यू रे: मैंने एक नई एएसपी.नेट परियोजना के साथ प्रयास किया, और इस मामले में मुझे आपके जैसा ही परिणाम मिला: सत्यापन * ठीक काम नहीं करता है। मैं अपने अन्य एप्लिकेशन में कुछ भी स्पष्ट नहीं सोच सकता जो कि इसका कारण हो सकता है ... लेकिन यह वास्तव में कोई फर्क नहीं पड़ता, मैं केवल न्यूनतम और अधिकतम मूल्य दोनों को स्पष्ट रूप से निर्दिष्ट करना सुनिश्चित करता हूं। इसका परीक्षण करने के लिए समय निकालने के लिए धन्यवाद :) – Nailuj

0

बस इसे और अधिक भ्रमित करने के लिए ..

मेरी FormView में (जो एक UpdatePanel में है अगर है कि किसी भी फर्क नहीं पड़ता) मेरे पास है ..

<div class="Width100PercentPadded"> 
    <div class="Width40PercentPadded FloatLeft ClearLeft"> 
     Latitude: 
    </div> 
    <div class="Width60PercentPadded FloatLeft"> 
     <asp:TextBox runat="server" ID="txtLatitude" CssClass="Width100Percent" Text='<%#  Bind("Latitude") %>' ></asp:TextBox> 
     <asp:CompareValidator ID="CompareValidatorLatitude" runat="server" ControlToValidate="txtLatitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Latitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator> 
     <asp:RangeValidator ID="RangeValidatorLatitude" runat="server" ControlToValidate="txtLatitude" MinimumValue="0" MaximumValue="90" ErrorMessage="Latitude in range 0 to 90" Text="range 0 to 90" ForeColor="Red" Display="Dynamic"></asp:RangeValidator> 
    </div> 
</div> 

<div class="Width100PercentPadded"> 
    <div class="Width40PercentPadded FloatLeft ClearLeft"> 
     Longitude: 
    </div> 
    <div class="Width60PercentPadded FloatLeft"> 
     <asp:TextBox runat="server" ID="txtLongitude" CssClass="Width100Percent" Text='<%# Bind("Longitude") %>'></asp:TextBox> 
     <asp:CompareValidator ID="CompareValidatorLongitude" runat="server" ControlToValidate="txtLongitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Longitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator> 
     <asp:RangeValidator ID="RangeValidatorLongitude" runat="server" ControlToValidate="txtLongitude" MinimumValue="0" MaximumValue="180" ErrorMessage="Longitude in range 0 to 180" Text="range 0 to 180" ForeColor="Red" Display="Dynamic"></asp:RangeValidator> 

    </div> 
</div> 

नोट अपना अक्षांश और देशांतर सत्यापन मूलतः एक ही है, सिवाय इसके देशांतर एक उच्च MAXVALUE अनुमति देता है।

जब चल रहा है, देशांतर वास्तव में मान्य है के रूप में उम्मीद - प्रकार अंकीय होना चाहिए और मान होना चाहिए अक्षांश प्रकार 0 और 180

के बीच संख्यात्मक होनी चाहिए, और रेंज में विफल रहता है, तो मान ऋणात्मक है, लेकिन MAXVALUE नहीं है जाँच की। मैं टेक्स्टबॉक्स में लाखों में मूल्य डाल सकता हूं और सत्यापन विफल नहीं होता है।

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