2009-08-18 21 views
23

वर्तमान में मैं अपने डोमेन ऑब्जेक्ट्स को अपने विचारों में पास कर रहा हूं, और सीधे POST से उन्हें बाध्यकारी कर रहा हूं। हर कोई कहता है कि यह बुरा है, इसलिए मैं ViewModel अवधारणा में जोड़ने का प्रयास कर रहा हूं।एमवीसी में POST कार्यों के लिए ViewModels का उपयोग करके

हालांकि, मुझे यह बहुत सुंदर तरीके से करने का कोई तरीका नहीं मिल रहा है, और मैं जानना चाहता हूं कि अन्य लोगों के समाधान बहुत गन्दा नियंत्रक कार्रवाई के साथ समाप्त नहीं हो रहे हैं।

कहते हैं कुछ "व्यक्ति को जोड़ने" कार्यक्षमता इस तरह दिखता है के लिए विशिष्ट प्रक्रिया:

  1. एक खाली व्यक्ति viewmodel मान्य डेटा
  2. का प्रतिनिधित्व
  3. पद वापस (में) एक दृश्य के लिए एक GET अनुरोध भेजना नियंत्रक बांधता है व्यक्ति viewmodel
  4. पर डेटा तैनात करता है, तो बंधन में विफल रहता है, मैं के रूप में एक ही कार्रवाई करने की जरूरत है (1) लेकिन कुछ डेटा, नहीं एक खाली वस्तु और त्रुटियों के साथ
  5. यदि सफल बंधन, मैं प्रतिबद्ध व्यक्ति को बचाने, एक प्रदर्शन वी एम के लिए नक्शे उपयोगकर्ताओं के विवरण और एक दृश्य में इसे वापस
  6. अगर मान्यता: एक असली मॉडल
  7. मॉडल
  8. को मान्य करता है, तो सत्यापन पारित कर दिया पर वीएम से गुण मैप करने की आवश्यकता असफल रहा, वही क्रियाएं करें (1) लेकिन कुछ डेटा और त्रुटियों के साथ

यह सब एक नियंत्रक कार्रवाई (जीईटी को अनदेखा कर) में करना निश्चित रूप से एसआरपी या डीआरवाई नहीं है।

मैं इस प्रक्रिया को तोड़ने का एक तरीका सोचने की कोशिश कर रहा हूं ताकि यह एसआरपी का पालन कर सके, स्वच्छ, मॉड्यूलर और सभी टेस्टेबल से ऊपर है।

इस के लिए लोगों का समाधान क्या है?

मैं अलग-अलग तरीकों, स्मार्ट मॉडलबिंडर्स और केवल सादा ब्रूट फोर्स में चिंताओं को अलग करने के लिए कस्टम कंट्रोलर-एक्शन-इनवॉकर्स के साथ प्रयोग कर रहा हूं लेकिन मैं अभी तक खुश होने के समाधान में आ गया हूं।

पीएस क्योंकि यह बहुत जटिलता जोड़ता है, मुझे विश्वास दिलाता है कि मुझे

+0

आप क्या खत्म किया कर रही? –

+1

अभी तक कुछ भी नहीं :(अभी भी एक सुरुचिपूर्ण समाधान पर निर्णय लेने की कोशिश कर रहा है, इसलिए मेरे नियंत्रक वास्तव में अव्यवस्थित नहीं होते हैं। मुझे लगता है कि असली जवाब openrasta है। –

+0

शायद ये पोस्ट थोड़ा सा मदद कर सकते हैं: http://stackoverflow.com/a/25460769/3 9 6 9 501, http://stackoverflow.com/a/25169023/1475331 –

उत्तर

2

एमवीवीएम (व्यू मॉडेल) पैटर्न निश्चित रूप से जाने वाला है, मेरे पास कुछ दिनों पहले एक कार्रवाई पर पोस्ट करने के बारे में एक ही सवाल था - यहां लिंक है: MVVM and ModelBinders in the ASP.NET MVC Framework

परिणाम यह था कि आप जटिल प्रकार को वापस पोस्ट करने के लिए बाइंड विशेषता का उपयोग कर सकते हैं।

6

मुझे भी यही असुविधा महसूस हुई है। मेरे चारों ओर एक ही रास्ता निम्न करने के लिए कर दिया गया है:

  1. एक बांधने की मशीन बनाने के लिए बाध्य करने और देखने मॉडल
  2. मान्य करने के लिए एक बंधक बनाएं डेटाबेस से इकाई पाने के लिए (या बस नियंत्रक में यह कर)
  3. सुपरक्लास में विरासत में सहेजें विधि को कॉल करें। यह विधि व्यूमोडेल और इकाई को अपडेट करती है जिसे अपडेट किया जाएगा, और आपके द्वारा अपने चरणों में सूचीबद्ध सभी काम करता है।

कार्रवाई विधि इस प्रकार है:

public ActionResult Whatever(TViewModel viewModel, TEntity entity) 
{ 
    return Save(viewModel, entity); 
} 

आधार नियंत्रक एक सामान्य परिभाषा है, तो जैसे:

public abstract BaseController<TEntity, TViewModel> 
    where TEntity : Entity 
    where TViewModel : ViewModel 

निर्माता है दो निर्भरता, इकाई भंडार के लिए एक और मॉडल मैपर के लिए दूसरा, जैसे:

protected BaseController(IRepository<TEntity> repository, IMapper<TEntity, TViewModel> mapper) 

स्थान पर इस के साथ, आप तो, एक संरक्षित विधि सहेजें कि उपवर्ग में नियंत्रक कार्यों से कहा जा सकता है लिख सकते हैं जैसे इतना:

protected ActionResult Save(TViewModel viewModel, TEntity entity) 
{ 
    if (!ModelState.IsValid) 
     return View(viewModel); 

    _mapper.Map(viewModel, entity); 
    if (!entity.IsValid) 
    { 
     // add errors to model state 
     return View(viewModel); 
    } 

    try 
    { 
     _repository.Save(entity); 
     // either redirect with static url or add virtual method for defining redirect in subclass. 
    } 
    catch (Exception) 
    { 
     // do something here with the exception 
     return View(viewModel); 
    } 
} 

जहाँ तक testability के रूप में, आप परीक्षण कर सकते हैं वैध में गुजर विधि को बचाने/अवैध दृश्य मॉडल और इकाइयों। आप मॉडल मैपर, दृश्य मॉडल की वैध स्थिति, और इकाई की वैध स्थिति के कार्यान्वयन का परीक्षण कर सकते हैं।

आधार नियंत्रक जेनेरिक बनाकर, आप अपने डोमेन में प्रत्येक इकाई/व्यूमोडेल कॉम्बो के लिए इस पैटर्न को दोहरा सकते हैं, यदि आप एक ही काम करने के लिए कई नियंत्रक बना रहे हैं।

मुझे यह जानने में बहुत दिलचस्पी है कि दूसरों को इसके बारे में क्या कहना है। महान सवाल

+0

दिलचस्प विचार +1 –

+2

निश्चित रूप से दिलचस्प विचार, लेकिन ओपनरास्टा अभी भी एक बेहतर विकल्प है :) – Dve

0

मैं asp.net MVC के नमूना आवेदन में कई अच्छे समाधान है जो download of valueinjecter में है (नक्शाकार है कि मैं करने के लिए/संस्थाओं से ViewModels मैप करने के लिए उपयोग करते हैं, आप भी मैप कर सकते हैं FormCollection/अनुरोध संस्थाओं के लिए)

यहाँ एक है:

public class TinyController :Controller 
     { 
      private readonly IModelBuilder<Person, PersonViewModel> modelBuilder; 

      public TinyController() 
      { 
       modelBuilder = new PersonModelBuilder(); 
      } 

      public ActionResult Index() 
      { 
       return View(modelBuilder.BuildModel(new PersonRepository().Get())); 
      } 

      [HttpPost] 
      public ActionResult Index(PersonViewModel model) 
      { 
       if (!ModelState.IsValid) 
        return View(modelBuilder.RebuildModel(model)); 

        var entity = modelBuilder.BuildEntity(model); 
... 
//save it or whatever 
      } 
     } 
संबंधित मुद्दे