मैं कहना चाहूंगा कि आपने क्लाइंट इंटरैक्शन के दोनों दिशाओं के लिए ViewModel शब्द का पुन: उपयोग किया है। यदि आपने वाइल्ड में पर्याप्त ASP.NET MVC कोड पढ़ा है, तो आपने संभवतः ViewModel और EditMelel के बीच अंतर देखा है। मुझे लगता है कि यह महत्वपूर्ण है।
एक ViewModel एक दृश्य प्रस्तुत करने के लिए आवश्यक सभी जानकारी का प्रतिनिधित्व करता है। इसमें वह डेटा शामिल हो सकता है जो स्थिर गैर-संवादात्मक स्थानों में प्रदान किया गया हो और विशुद्ध रूप से डेटा प्रदान करने के लिए जाँच करने के लिए कि वास्तव में क्या करना है। एक नियंत्रक GET कार्रवाई आम तौर पर अपने दृश्य के लिए ViewModel की पैकेजिंग के लिए जिम्मेदार है।
एक EditModel (या शायद एक ActionModel) उस डेटा को प्रदर्शित करने के लिए आवश्यक कार्रवाई करता है जो उपयोगकर्ता उस POST के लिए करना चाहता था। तो एक EditModel वास्तव में एक कार्रवाई का वर्णन करने की कोशिश कर रहा है। यह संभवतः ViewModel के कुछ डेटा को बाहर कर देगा और यद्यपि संबंधित मुझे लगता है कि यह महसूस करना महत्वपूर्ण है कि वे वास्तव में अलग हैं।
एक विचार
कहा कि आप बहुत आसानी से मॉडल से जाने के लिए एक AutoMapper विन्यास हो सकता है -> ViewModel और एक अलग EditModel से जाने के लिए -> मॉडल। फिर विभिन्न नियंत्रक क्रियाओं को बस AutoMapper का उपयोग करने की आवश्यकता है। एडमेलमॉडल उस पर कार्य कर सकता है, यह मॉडल के खिलाफ गुणों को मान्य करने के लिए और उन मूल्यों को स्वयं मॉडल पर लागू करने के लिए हो सकता है। यह और कुछ नहीं कर रहा है और आपके पास अनुरोध को EditModel में मैप करने के लिए MVC में मॉडलबिंडर है।
एक अन्य विचार
इससे परे कि मैं हाल ही में इस बारे में सोच रहा था कि एक्शनमॉडल के विचार से काम करता है कि ग्राहक आपके लिए जो पोस्ट कर रहा है, वह वास्तव में उपयोगकर्ता द्वारा किए गए कई कार्यों का विवरण है और न केवल डेटा का एक बड़ा ग्लोब। यह निश्चित रूप से प्रबंधित करने के लिए क्लाइंट पक्ष पर कुछ जावास्क्रिप्ट की आवश्यकता होगी, लेकिन विचार पेचीदा है मुझे लगता है।
अनिवार्य रूप से जैसे ही उपयोगकर्ता आपके द्वारा प्रस्तुत स्क्रीन पर कार्य करता है, जावास्क्रिप्ट कार्रवाई की वस्तुओं की एक सूची बनाना शुरू कर देगा। एक उदाहरण संभवतः उपयोगकर्ता एक कर्मचारी सूचना स्क्रीन पर है। वे अंतिम नाम को अपडेट करते हैं और एक नया पता जोड़ते हैं क्योंकि कर्मचारी की हाल ही में शादी हुई है। कवर के तहत यह एक ChangeEmployeeName
और एक का उत्पादन करता हैAddEmployeeMailingAddress
एक सूची में वस्तुओं का । उपयोगकर्ता परिवर्तनों को करने के लिए 'सहेजें' पर क्लिक करता है और आप दो वस्तुओं की सूची जमा करते हैं, जिनमें से प्रत्येक में प्रत्येक कार्रवाई करने के लिए आवश्यक जानकारी होती है।
आपको एक अधिक बुद्धिमान ModelBinder की आवश्यकता होगी तब डिफ़ॉल्ट एक लेकिन अच्छा JSON सीरियलाइज़र सर्वर साइड वालों को क्लाइंट साइड एक्शन ऑब्जेक्ट्स की मैपिंग का ध्यान रखने में सक्षम होना चाहिए। सर्वर साइड वाले (यदि आप 2-स्तरीय वातावरण में हैं) आसानी से वे तरीके हो सकते हैं जो उस मॉडल पर कार्रवाई पूरी करते हैं जिसके साथ वे काम करते हैं। इसलिए नियंत्रक क्रिया को समाप्त करने के लिए मॉडल उदाहरण के लिए एक आईडी प्राप्त करना और उस पर प्रदर्शन करने के लिए क्रियाओं की एक सूची समाप्त हो जाती है। या कार्यों में उन्हें बहुत अलग रखने के लिए आईडी है।
तो शायद सर्वर साइड में ऐसा कुछ महसूस होता है:
public interface IUserAction<TModel>
{
long ModelId { get; set; }
IEnumerable<string> Validate(TModel model);
void Complete(TModel model);
}
[Transaction]
public ActionResult Save(IEnumerable<IUserAction<Employee>> actions)
{
var errors = new List<string>();
foreach( var action in actions )
{
var employee = _employeeRepository.Get(action.ModelId);
errors.AddRange(action.Validate(employee));
}
foreach( var action in editModel.UserActions )
{
var employee = _employeeRepository.Get(action.ModelId);
action.Complete(employee);
_employeeRepository.Update(employee);
}
}
जब से आप सही IUserAction उदाहरण और अपने IUserAction उदाहरण प्राप्त करने के लिए अपने ModelBinder पर भरोसा कर रहे हैं, तब से पोस्टिंग की कार्रवाई को काफी सामान्य बना देता है, या तो जानकारी के साथ मॉडल में सही तर्क या (अधिक संभावना) कॉल करने के लिए।
यदि आप 3 स्तरीय वातावरण में थे, तो IUserAction को सीमा के पार गोली मारने के लिए सरल DTO बनाया जा सकता है और ऐप लेयर पर एक समान विधि में प्रदर्शन किया जा सकता है। इस बात पर निर्भर करता है कि आप उस परत को कैसे करते हैं और इसे आसानी से विभाजित किया जा सकता है और फिर भी एक लेन-देन में बना रहता है (जो मन में आता है वह है अगाथा का अनुरोध / प्रतिक्रिया और डीआई और एनएचबर्नेट के पहचान मानचित्र का लाभ लेना)।
वैसे भी मुझे यकीन है कि यह एक आदर्श विचार नहीं है, इसे प्रबंधित करने के लिए क्लाइंट की ओर से कुछ JS की आवश्यकता होगी, और मैं अभी तक यह देखने के लिए कि यह कैसे सामने आता है, एक परियोजना करने में सक्षम नहीं है, लेकिन पोस्ट कैसे करने के बारे में सोचने की कोशिश कर रहा था वहाँ पहुँचें और फिर से वापस आएँ ताकि मुझे लगा कि मैं अपने विचार दूंगा। मुझे उम्मीद है कि यह मदद करता है और मैं बातचीत के प्रबंधन के अन्य तरीकों के बारे में सुनना पसंद करूंगा।