2012-06-22 22 views
18

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

नियंत्रक से:

public ActionResult PassData() 
{ 
    Customer customer = new Customer(); 
    string[] data = Monkey.RetrieveData(); 
    bool isvalid = ModelHelper.CreateCustomer(data, out customer); 
} 

सहायक से:

public bool CreateCustomer(string[] data) 
{ 
    Customter outCustomer = new Customer(); 
    //put the data in the outCustomer var 
    //??? Check that it's valid 

} 

उत्तर

33

आप एक ASP.NET संदर्भ के बाहर डेटा एनोटेशन सत्यापन इस्तेमाल कर सकते हैं:

public bool CreateCustomer(string[] data, out Customer customer) 
{ 
    customer = new Customer(); 
    // put the data in the customer var 

    var context = new ValidationContext(customer, serviceProvider: null, items: null); 
    var results = new List<ValidationResult>(); 

    return Validator.TryValidateObject(customer, context, results, true); 
} 
+0

दुर्भाग्यवश, यह सत्यापन किसी भी जटिल बच्चे वस्तुओं या संग्रहों के माध्यम से पुन: कार्य नहीं करता है। Validator.TryValidateObject (...) केवल तत्काल संपत्ति और फ़ील्ड सत्यापन करता है, और इसे एक दिन कहते हैं, जैसा कि एमवीसी दुनिया में नियंत्रक में मॉडल बाध्यकारी पर होने वाली वैधता का विरोध करता है जो पूरे ऑब्जेक्ट ग्राफ़ को पार करता है। – neumann1990

1

डॉन ' नियंत्रक के बाहर मॉडलस्टेट का उपयोग नहीं करते हैं। मैं नहीं देख सकता कि बंदर क्या है। RerierieveData() करता है लेकिन सामान्य रूप से मैं HTTPRequest से सादा डेटा पास नहीं करता हूं और बी) आपके बैकएंड पर स्ट्रिंग-एरे जैसे अनियमित डेटा। वेब-फ्रेमवर्क को इनकमिंग डेटा की जांच करने दें और बैकएंड में उपयोग करने के लिए टाइप की गई कक्षाओं को इंस्टेंट करें। ध्यान दें कि यदि आप अपना डेटा मैन्युअल रूप से लागू करते हैं तो HTML इंजेक्शन (XSS स्क्रिप्टिंग इत्यादि) की जांच मैन्युअल रूप से की जानी चाहिए।

इसके बजाय मॉडल-बाइंडर्स आदि का उपयोग करें और टाइप बैकएंड डेटा (उदाहरण के लिए ग्राहक वर्ग के उदाहरण) को अपने बैकएंड में पास करें। स्कॉट गु से एक पुरानी पोस्ट है जो एमवीसी 1: http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

अपने उदाहरण में एमवीसी के मॉडल बाध्यकारी को अपने ग्राहक को बनाने और फ़ील्ड मानों को लागू करने दें (ऊपर पैटर्न देखें कि यह पैटर्न कैसे काम करता है)। फिर आप अपने ग्राहक उदाहरण को अपने बैकएंड पर देते हैं जहां आपके टाइप किए गए ग्राहक उदाहरण (उदाहरण के लिए मैन्युअल रूप से या डेटा एनोटेशन के आधार पर) अतिरिक्त सत्यापन जांच की जा सकती है।

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