2011-10-19 15 views
11

एंटिटी फ्रेमवर्क और एएसपी.नेट एमवीसी 3 का उपयोग करके मेरे मॉडल को सत्यापित करते समय मुझे स्ट्रिंग लम्बाई एट्रिब्यूट का उपयोग करने में परेशानी हो रही है।StringLengthAttribute कैसे काम करता है?

मेरा मॉडल एक इकाई फ्रेमवर्क इकाई पर आधारित है जिसमें एक आंशिक वर्ग है जो मेटाडेटा टाइप करने के लिए उपयोग करने के लिए मेटाडेटा टाइप विशेषता का उपयोग करता है जो मेटाडेटा की खोज करते समय उपयोग करने के लिए टाइप करता है। यह नीचे दिए गए कोड में दिखाया गया है:

[MetadataType(typeof(PartMetadata))] 
public partial class Part { } 

class PartMetadata 
{ 
    [DisplayName("Part number")] 
    [Required(ErrorMessage="* Required")] 
    [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")] 
    public string Number { get; set; } 

    [StringLength(255, MinimumLength=3, 
     ErrorMessage="* Part descriptions must be between 3 and 255 characters in length.")] 
    public string Description { get; set; } 

    [DisplayName("Drawing required?")] 
    public bool DrawingRequired { get; set; } 
} 

समस्या मैं कर रहा हूँ कि वर्णन फ़ील्ड ठीक से मान्य नहीं किया जा रहा है। मेरे मॉडल के नीचे दिए गए कोड का उपयोग ठीक के रूप में मान्य है और मुझे विवरण नियंत्रक के खाली होने पर भी मेरे नियंत्रक के इंडेक्स पेज पर रीडायरेक्ट किया गया है।

if (ModelState.IsValid) 
{ 
    return RedirectToAction("Index"); 
} 
else 
{ 
    return View(); 
    } 

मैं तो वर्णन क्षेत्र के लिए एक RequiredAttribute जोड़ देते हैं तो अपने मॉडल एक अमान्य स्थिति में होने के रूप में वर्गीकृत किया जाता है और मेरे रूप में आवश्यक विशेषता के डिफ़ॉल्ट त्रुटि संदेश दिखा पुनः लोड है। यदि मैं बाद में वर्णन फ़ील्ड को संपादित करता हूं तो यह स्ट्रिंग लम्बाई विशेषता में सेट प्रमाणीकरण त्रुटि संदेश दिखाता है।

क्या यह विशेषता व्यवहार करना चाहिए? यह आवश्यक विशेषता वाले गुणों को सजाने में कोई समस्या नहीं है, लेकिन क्षेत्र की आवश्यकता नहीं है क्योंकि counterinuitive लगता है, मैं बस यह सुनिश्चित करना चाहता हूं कि यदि उपयोगकर्ता कुछ टाइप करता है तो यह स्ट्रिंग लंबाई विशेषता की सीमा के भीतर आता है।

+1

मैं समझता हूँ, यह वास्तव में काम कर रहा है के रूप में आप यह उम्मीद करते हैं। यह सिर्फ स्ट्रिंग लम्बाई को मान्य कर रहा है *** यदि ** उपयोगकर्ता कुछ टाइप करता है *। यदि आप * वास्तव में * उसे कुछ टाइप करना चाहते हैं, तो [आवश्यक] की आवश्यकता है, जैसा आपने कहा था। आप किस व्यवहार के लिए खोज रहे हैं? – Joao

+1

फ़ील्ड को रिक्त स्थानांतरित करना ** शून्य ** माना जाता है और वह तब होता है जब [आवश्यक] विशेषता ट्रिगर्स होती है। – Joao

उत्तर

18

हां, यह सही व्यवहार है। StringLength सत्यापित करता है कि एक स्ट्रिंग एक निश्चित लंबाई है, लेकिन आवश्यक है कि स्ट्रिंग दर्ज की जाए। [आवश्यक] के साथ विवरण सजाने के लिए, ताकि आपके पास स्ट्रिंग के लिए दोनों आवश्यकताएं हों, और स्ट्रिंग लम्बाई स्ट्रिंग लम्बाई पर बाधाएं प्रदान करेगी।

+1

+1 आपने मुझे पंच पर हराया। यह एक साधारण फिक्स की तरह दिखता है। –

+0

धन्यवाद। यह वास्तव में सही समझ में आता है और यह नल स्ट्रिंग था जो मुझे फेंक रहा था। मैंने सत्यापित किया है कि यह काम करता है। धन्यवाद। –

0

कीवर्ड [आवश्यक] कॉल .cshtml फ़ाइल में होने पर लंबाई और मान जांच सुनिश्चित करता है। आपको उन फ़ील्ड के लिए प्रविष्टि चेतावनियां नहीं मिलेंगी जिनमें शामिल नहीं हैं, लेकिन यदि आप [आवश्यक] का उपयोग कर मॉडल मॉडल में से कोई भी अदृश्य हैं और उचित रूप से आबादी नहीं हैं।

इसलिए, किसी मॉडल को सभी आवश्यक फ़ील्ड पर कॉल किए बिना उपयोग किया जा सकता है, और आपका वेब पेज कई पृष्ठों के माध्यम से मॉडल के फ़ील्ड मानों के समूह एकत्र कर सकता है या मॉडल का उपयोग कर .cshtml से केवल शामिल फ़ील्ड का उपयोग कर सकता है।

कीवर्ड इस प्रकार है:

class PartMetadata 
{ 
    [Required] 
    [DisplayName("Part number")] 
    [Required(ErrorMessage="* Required")] 
    [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")] 
    public string Number { get; set; } 
संबंधित मुद्दे