2011-01-10 19 views
15

MVC में मॉडल देखने पर इस दृष्टिकोण का उपयोग करना: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspxसत्यापन डीआरवाई कैसे बनाए रखें?

मेरे मन में एक अनुत्तरित सवाल छोड़ देता है। तो यह लगभग समय है जब मैंने इसे साफ़ कर दिया था।

यदि मैं डोमेन गुणों को मैप करने के लिए ऑटो मैपर का उपयोग कर रहा हूं, तो मैं सराहना करता हूं कि मेरी डोमेन परत सत्यापन नियमों का एक सेट वापस कर सकती है जब डीटीओ को सहेजी गई डोमेन इकाई में मैप किया जाता है।

लेकिन, मुझे DRY को काम करने के लिए क्लाइंट सत्यापन प्राप्त करने और मॉडल स्थिति में त्रुटियों को जोड़ने का तरीका नहीं दिखता है, इसलिए वे दृश्य मॉडल पर सही संपत्ति से मेल खाते हैं।

चीयर्स

+1

अच्छा बिंदु में। मैंने कोशिश करने और इसका समाधान करने के लिए अपने पिछले कुछ प्रश्नों पर ऐसा किया है। – nick

उत्तर

11

मैं कुछ रोचक प्रतिक्रियाओं के साथ एक संबंधित सवाल पाया:

Mapping Validation Attributes From Domain Entity to DTO

मैं इस बारे में सोच रहा है, और एक तरह से यह स्थिति के अनुरूप है हम सर्वर साइड के साथ है और क्लाइंट-साइड सत्यापन। (उदाहरण के लिए NHibernate Validator और jQuery.validate दोनों का उपयोग करना)।

इन दिनों यह बहुत अच्छी तरह से स्वीकार किया गया है कि आपके पास सर्वर-साइड सत्यापन का पूरा सेट होना चाहिए, और क्लाइंट-साइड सत्यापन जोड़ना एक विकल्प है जिसे आप अपने एप्लिकेशन को अधिक उपयोगकर्ता के अनुकूल बनाने के लिए चुन सकते हैं। ऐसा लगता था कि आपको अपने क्लाइंट-साइड सत्यापन को मैन्युअल रूप से कार्यान्वित करना था, लेकिन आपने उपयोगिता में लाभ के कारण काम की नकल स्वीकार कर ली।

मैं तर्क दूंगा कि हम यहां क्या कर रहे हैं, यह बहुत समान है। आप को अपनी डोमेन परत में सत्यापन करना चाहिए। आप हमेशा सत्यापन को जोड़ने के लिए उपभोग करने वाले अनुप्रयोगों पर भरोसा नहीं कर सकते हैं।

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

क्लाइंट/सर्वर केस इन दिनों एक गैर-समस्या है क्योंकि इसे स्वचालित करने के लिए इतना काम किया गया है, सर्वर-साइड कोड से क्लाइंट-साइड कोड उत्पन्न करना (उदाहरण के लिए ASP.Net MVC में ModelValidatorProvider)। मेरा मानना ​​है कि अधिक से अधिक लोग दृश्य मॉडल/डीटीओ का उपयोग करते हैं, इसलिए हम स्वचालित रूप से डीटीओ पर डोमेन सत्यापन को मैप करने के लिए समान समाधान देखना शुरू कर देंगे (it's already happening with AutoMapper)।

तो संक्षेप में, मेरी (बल्कि आदर्श से व्यावहारिक;)) जवाब है:

, अब के लिए सूखी के उल्लंघन स्वीकार दोनों ही स्थानों पर सत्यापन करते हैं, और परियोजनाओं है कि यह स्वचालित करने के लिए उद्देश्य के लिए योगदान करने की कोशिश भविष्य

+0

मैं इसे उत्तर के रूप में दे रहा हूं क्योंकि आप व्यापार को बहुत अच्छी तरह से उजागर करते हैं और इंगित करते हैं कि कोई सार्वभौमिक-सही समाधान नहीं है। – nick

2

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

आप नियंत्रक पोस्ट क्रियाएं व्यूमोडेल में लेते हैं और IsValid संपत्ति की जांच करते हैं। इस तरह, आप एक ही कोड के साथ क्लाइंट और सर्वर पर सत्यापित कर रहें (या, मैं डेटा एनोटेशन के मामले में गुण कहना चाहिए):

[HttpPost] 
public ActionResult ResetPassword(ResetPasswordViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
    // convert to dto/entity and pass to next layer 
    // redirect to success page 
    return RedirectToAction("ResetPasswordSuccess"); 
    } 
    // display original view which will display error messages 
    return View(); 
} 

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

+2

मेरे लिए या तो सूखी क्योंकि मैं मॉडल और वी एम पर मान्य करने के लिए की जरूरत नहीं है कि - या क्योंकि मैं केवल वीएम को मान्यता जोड़ने यह मेरे मॉडल पर मेरे व्यापार नियमों को लागू करने की अनुमति नहीं है। – nick

+0

मुझे लगता है कि आप मूल रूप से कह रहे हैं आप डिजाइन निर्णय है कि आपके डोमेन ही कभी अपने वेब एप्लिकेशन द्वारा भस्म हो जाएगा करने के बाद, अपने वेब ऐप्लिकेशन हमेशा डोमेन संस्थाओं के बजाय दृश्य मॉडल का उपयोग करना चाहिए के डेवलपर्स CRUD कार्रवाई करने के लिए है? –

+0

यानी आप स्वीकार करते हैं कि डोमेन मॉडल खराब डेटा के लिए उपयुक्त है, क्योंकि आप जानते हैं कि आपके डेवलपर इस तरह इसका उपयोग नहीं करेंगे? –

5

मैं मॉडल को व्यूमोडेल पर अन्य व्यू-विशिष्ट फ़ील्ड के साथ एक संपत्ति के रूप में रखना पसंद करता हूं। इस तरह यह एमवीसी द्वारा बाध्यकारी के दौरान मान्य हो जाता है और एमवीसी के माध्यम से बंधे नहीं होने पर मैं इसे बैकएंड पर मान्य कर सकता हूं। इस तरह क्लाइंट सत्यापन एमवीसी द्वारा प्रदान किया जाता है और मुझे सत्यापन मॉडल के साथ साफ मॉडल मिलते हैं जो सीधे दृश्य से बंधे नहीं होते हैं।

public class MyViewModel 
{ 
    public MyModel MyModel {get;set;} 
    public bool IsSomethingAllowed {get;set;} 
} 

public class MyModel 
{ 
    public int Id {get;set;} 
    [Required] 
    public string Name {get;set;} 
} 
+1

यह एक ऐसा सम्मेलन है जिस पर मेरी टीम ने फैसला किया है। जिन परियोजनाओं पर हम काम करते हैं, उनके लिए कमजोर-युग्मित दृश्य मॉडल के लिए डीआरवाई सत्यापन खोना व्यापार के लायक नहीं है - यह कम कुशल और त्रुटि से अधिक प्रवण है। – nick

+1

डोमेन इकाइयों का उपयोग करने में समस्याएं हैं। जैसे (1) क्या होगा यदि प्रकार गलत है उदा। वैध पूर्णांक नहीं है? आपके डोमेन इकाई पर आपके पास कोई भी सत्यापन हिट नहीं होगा, मॉडल बाइंडिंग असफल हो जाएगी और आपको एक सामान्य संदेश मिलेगा। व्यूमोडेल के साथ, आप सभी गुणों के लिए स्ट्रिंग का उपयोग कर सकते हैं, यह सुनिश्चित कर सकते हैं कि मॉडल बाइंडिंग काम करता है और फिर आपका व्यूमोडेल सत्यापन यह चुन सकता है कि यह एक वैध पूर्णांक है और उपयोगकर्ता को कस्टम त्रुटि संदेश प्रदर्शित करता है। (2) यदि आप सत्यापन संदेशों के लिए संसाधन फ़ाइलों का उपयोग कर रहे हैं, तो आपके डोमेन ऑब्जेक्ट्स को आपके संसाधन फ़ाइल डीएलएल को संदर्भित करना होगा। बहुत अच्छा नहीं है! –

+0

बहुत अच्छा नहीं मैं सहमत हूं। लेकिन क्या आप मॉडल परत में व्यावसायिक नियमों को लागू करना चाहते हैं या नहीं। यह मुख्य व्यापार बंद प्रतीत होता है। अच्छा है कि आप इसे बाहर इंगित करते हैं। – nick

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