2009-07-16 11 views
19

कैसे ASP.NET MVC में सत्यापन को लागू करने पर सुझाव के अधिकांश (सत्यापन विशेषताओं के साथ मॉडल और नियंत्रक या मॉडल की सजा गुणों के बीच या तो इमारत सेवा परतों) मॉडल के आसपास केंद्रित करने के लिए लग रहे हैं ।मान्यता ASP.NET MVC में ViewModels पर

मेरे आवेदन में मैं नियंत्रकों और विचारों के बीच सभी संचार के लिए ViewModels का उपयोग करता हूं।

मैं अपना लॉगिन एक संपत्ति 'EmailAddress' कहा जाता है के साथ 'LoginViewModel' नामक पेज के लिए एक ViewModel की है।

उपयोगकर्ता अपने ईमेल पते में प्रवेश करती है और क्लिक्स सबमिट करते हैं, इस ViewModel आबादी और नियंत्रक, जहां ईमेल पता मान्य है करने के लिए भेजा जाता है।

यह एक मान्य ईमेल पता होना चाहिए, और उपयोगकर्ता एक डोमेन है कि सिस्टम में पंजीकृत है या से होना चाहिए।

इस पर सत्यापन जोड़ने का एक सुविधाजनक तरीका क्या होगा? क्या मुझे खुद को ViewModel में सत्यापन रखना चाहिए? या यह नियंत्रक में रहना चाहिए?

उत्तर

5

"मैं ViewModel अपने आप में मान्यता रखना चाहिए? या यह नियंत्रक में रहना चाहिए "मैं रॉबर्ट से सहमत हूं लेकिन मैं अतिरिक्त स्वचालन के लिए एक प्लग जोड़ूंगा।

यदि आप xVal जैसे टूल को देखते हैं, तो आप उस नियमित सत्यापन (उदाहरण के लिए, आवश्यक फ़ील्ड, संख्याओं के भीतर) देख सकते हैं श्रेणियां, नियमित अभिव्यक्तियों से मेल खाने वाली स्ट्रिंग्स) स्वचालित रूप से आपके डेटा वर्गों के सजाने वाले क्षेत्रों द्वारा की जा सकती हैं। असल में, xVal स्वचालित रूप से नियमित सत्यापन के लिए जावास्क्रिप्ट लिख सकता है ताकि यह क्लाइंट पक्ष किया जा सके। सभी बिना किसी कोड को लिखे। गहरी मान्यताओं (उदाहरण के लिए क्या यह उपयोगकर्ता हमारे डेटाबेस में पंजीकृत डोमेन का सदस्य है?) मॉडल परत के अंदर सर्वर-पक्ष होता है।

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

public class Contact { 
    [Required] 
    string Name { get; set; } 
} 

public class ContactView { 
    public Contact Contact { get; set; } 
    public string SomeOtherViewProperty { get; set; } 
} 

और फिर नियंत्रक में, उथले सत्यापन होता है जब मॉडल को अद्यतन करने:

UpdateModel(contactViewModel.Contact, "Contact"); 

और सत्यापन में अधिक जानकारी या अधिक जटिल गणनाओं की आवश्यकता होती है मॉडल परत के अंदर ही होता है।

एक अन्य दृष्टिकोण इकाई वस्तु को एम्बेड नहीं करना है बल्कि दोनों के बीच व्यक्तिगत फ़ील्ड को मानचित्र बनाना है। मैंने हाल ही में AutoMapper नामक टूल के बारे में जागरूक हो गया है जो स्वचालित रूप से डोमेन के बीच फ़ील्ड को लिंक करता है और मॉडल ऑब्जेक्ट्स को देखता है। ऐसा लगता है कि इसे इस सत्यापन विधि का समर्थन करना चाहिए, हालांकि मैंने अभी तक इसका उपयोग नहीं किया है।

+0

महान विचार, कीथ! फिलहाल मेरे पास आपके जैसी ही रणनीति है - व्यू मॉडल्स में मॉडल एम्बेड करना। मुझे क्या चाहिए यदि मॉडल और व्यू मॉडेल दोनों एक ही तरीके से सत्यापन लागू कर सकें, और एक जेएस फ्रेमवर्क जैसे कि xVal किसी भी के साथ सहजता से काम कर सकता है। यह सबसे लचीला तरीका होगा। मुझे नहीं लगता कि सत्यापन विशेष रूप से मॉडल से जुड़ा होना चाहिए। – Jonathan

+0

मैं xVal सहित एम्बेडेड मॉडल कक्षाओं के साथ कस्टम व्यू मॉडल का भी उपयोग कर रहा हूं। हालांकि, ऐसे अवसर होते हैं जब मुझे मॉडल के गुणों का केवल एक सबसेट रखने के लिए मेरे व्यूमोडेल की आवश्यकता होती है। मैं वर्तमान में उन मॉडलों को मैप करने के लिए ऑटोमैपर देख रहा हूं। यह ठीक काम करता है, लेकिन मैं उस परिदृश्य में xVal का उपयोग कैसे करूं? MetaData विशेषता के साथ ViewModel को सजाने के लिए काम नहीं करता है क्योंकि एसोसिएटेड मेटाडाटाटाइप टाइप डिस्क्रिप्शन प्रदाता फेंकता है अगर मेटाडेटा ऑब्जेक्ट में वे गुण हैं जो व्यूमोडेल का हिस्सा नहीं हैं। यदि आप ऑटोमैपर का उपयोग कर रहे हैं, तो मैं जानना चाहता हूं कि आपने इस समस्या को कैसे हल किया है। –

3

NerdDinner tutorials मॉडल के आंशिक वर्ग (यानी लिंक से एसक्यूएल या इकाई फ्रेमवर्क) में होने वाली सत्यापन दिखाएं। लेकिन चूंकि आप व्यू मॉडल का उपयोग कर रहे हैं, इसलिए आप वहां सत्यापन तर्क डाल सकते हैं।

प्रमाणीकरण तर्क नियंत्रक में नहीं जाता है। दरअसल, यह एक चेकिंग संपत्ति के साथ नियंत्रक, यानी ModelState.IsValid से झुका है

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) { 

    if (ModelState.IsValid) { 

     try { 
      dinner.HostedBy = "SomeUser"; 

      dinnerRepository.Add(dinner); 
      dinnerRepository.Save(); 

      return RedirectToAction("Details", new { id=dinner.DinnerID }); 
     } 
     catch { 
      ModelState.AddModelErrors(dinner.GetRuleViolations()); 
     } 
    } 

    return View(new DinnerFormViewModel(dinner)); 
} 

पूर्ण विवरण यहां हैं:

बिल्डिंग मॉडल
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

और यहाँ:

ViewData और ViewModel
+०१२३५१६४१०६http://nerddinnerbook.s3.amazonaws.com/Part6.htm

+0

** नोट: ** अद्यतन नेर्डडिनर के लिए, यहां देखें: http://nerddinner.codeplex.com/SourceControl/changeset/view/ef63780655b0 –