2009-07-15 6 views
17

नोट: यह एक घना सवाल यह है कि और MVVM "डिजाइन पैटर्न", JSON और jQuery की अच्छी समझ की आवश्यकता है ....क्या एमवीवीएम एक डीएचटीएम आरआईए आवेदन (कोई सिल्वरलाइट/डब्ल्यूपीएफ) में संभव/व्यवहार्य है?

तो मैं एक सिद्धांत/दावा संभव और है कि DHTML में MVVM है व्यवहार्य और जानना चाहते हैं कि क्या आप मुझसे सहमत हैं और असहमत हैं और क्यों। डीएचटीएम में एमवीवीएम कार्यान्वित करना एक सर्वर इकाई को AJAX कॉल का उपयोग करके घूमता है जो जेएसओएन देता है और फिर एचटीएमएल को नियंत्रित करने के लिए जावास्क्रिप्ट के माध्यम से एचटीएमएल मैनिपुलेशन का उपयोग करता है।

तो इसे तोड़ने के लिए। चलो का कहना है कि मुझे लगता है कि एक डेटाबेस में लोग की खोज करने वाले खोज पृष्ठ का निर्माण कर रहा हूँ .....

देखें कुछ इस तरह दिखेगा:

 
    
     <body viewmodel="SearchViewModel"> 
      Search:<br /> 
      <input type="text" bindto="SearchString" /><br /> 
      <input type="button" value="Search" command="Search" /> 
      <br /> 
      <table bindto="SearchResults"> 
       <thead> 
        <tr> 
         <th>First Name</th> 
         <th>Last Name</th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr> 
         <td>${FirstName}</td> 
         <td>${LastName}</td> 
        </tr> 
       </tbody> 
      </table> 
     </body> 
 

कुछ गैर मानक मेरी एचटीएमएल पर विशेषताओं का उपयोग करना तत्व, मैंने घोषणा की है कि देखें और यह मेरे व्यूमोडेल के साथ कैसे बातचीत करेगा। मैंने जावास्क्रिप्ट में एमवीवीएम पार्सर बनाया है जो गैर-मानक विशेषताओं को समझता है और व्यूमोडेल का प्रतिनिधित्व करने वाले JSON ऑब्जेक्ट के साथ व्यू को जोड़ता है।

ViewModel एक JSON ऑब्जेक्ट होना होगा:

 
    
     //View Model SearchViewModel would be assocaited with View because of <body viewmodel="SearchViewModel"> 
     var SearchViewModel = { 
      //SearchString variable has a TwoWay binding 
      //to <input type="text" bindto="SearchString" />< 
      //if a user types into the text box, the SearchString property will "auto-magically" be updated 
      //because of the two way binding and how the element was interpreted via my MVVM parser 
      SearchString: '', 

      //SearchResults has a OneWay binding to <table bindto="SearchResults"> 
      SearchResults: new Array(), 

      //Search function will get "auto-magically" get called because of 
      //the command binding to <input type="button" command="Search" /> 
      Search: function() { 
       //using jquery to call into the server asynchronously 
       //when the server call is completed, the PopulateSearchResults method will be called 
       $.getJSON("www.example.com/SearchForPerson", 
         { searchString: SearchViewModel.SearchString }, 
         SearchViewModel.PopulateSearchResults); 
      } 

      PopulateSearchResults: function(data) { 
       //set the JSON array 
       SearchViewModel.SearchResults = data; 
       //simulate INotifyPropertyChanged using the MVVM parser 
       mvvmParser.notifyPropertyChanged("SearchResults"); 
      } 
     } 
 

मॉडल किसी भी सर्वर साइड संपत्ति कि JSON देता है ... इस उदाहरण में हो सकता है, मैं एक शोकहारा मुखौटा के रूप में एएसपी MVC प्रयोग किया है:

 
    
     public JsonResult SearchForPerson(string searchString) 
     { 
      PersonDataContext personDataContext = new PersonDataContext(); //linq to sql..... 

      //search for person 
      List<Person> results = 
       personDataContext.Persons 
           .Where(p => p.FirstName.Contains(searchString) 
              || p.LastName.Contains(searchString)) 
           .ToList(); 

      return Json(results); 
     } 
 

तो, फिर से सवाल:
MVVM संभव/व्यवहार्य एक DHTML रिया आवेदन में (कोई सिल्वरलाइट/है डब्ल्यूपीएफ) या मैंने अपना दिमाग खो दिया है?

क्या यह "एमवीवीएम फ्रेमवर्क" एक अच्छा विचार हो सकता है?

अवधारणा का सबूत: kaboom.codeplex.com

उत्तर

10

यह शायद knockout JS से लिंक करने का एक अच्छा समय होगा, जो एक जावास्क्रिप्ट एमवीवीएम फ्रेमवर्क है।

तुम भी backbone को देखने के लिए चाहते हो सकता है, एक जावास्क्रिप्ट MVC ढांचा:

1

यह संभव और व्यवहार्य दिखता है, केवल नकारात्मक पक्ष यह है कि आपका कोड अंतिम परिणाम प्राप्त करने के लिए पूरी तरह से क्लाइंट साइड प्रोसेसिंग पर निर्भर है।

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

+0

"मेरी राय में, आप अभी भी एक सर्वर साइड MVC वास्तुकला का प्रयोग के बजाय एक ग्राहक के पक्ष MVVM बनाने का प्रयास कर की एक पूरी बहुत बेहतर कर रहे हैं रूपरेखा "। हाँ ... किसी भी तरह से आप अपनी पूरी साइट को इस तरह के बुनियादी ढांचे का उपयोग नहीं करना चाहेंगे ... लेकिन जब एसिंक्रोनस इंटरैक्शन करते हैं, तो यह एमवीसी से बेहतर विकल्प हो सकता है। – Amir

+0

सहमत हुए। यह एमवीसी जैसे सर्वर साइड फ्रेमवर्क के साथ इस तरह भ्रमित मिश्रण क्लाइंट साइड फ्रेमवर्क प्राप्त कर सकता है (यदि सिंटैक्स और पेज मार्कअप समान दिखता है) ... लेकिन यह एक अच्छा कारण नहीं है कि इसे शॉट न दें। इनपुट के लिए –

+0

धन्यवाद। कभी-कभी मुझे लगता है कि मैं एक गूंज कक्ष में हूं और आपके इनपुट की बहुत सराहना की जाती है। – Amir

3

.NET 4.0 में एएसपी.NET डेटा बाइंडिंग सुविधाओं पर नज़र डालें - विजुअल स्टूडियो 2010 के साथ आता है। यह वही है जो आप देख रहे हैं कि आप एमएस तकनीक के साथ ठीक हैं या नहीं। codeplex

पर

Blog that details the feature

समुदाय प्रौद्योगिकी पूर्वावलोकन सैद्धांतिक रूप से आप बस अपने HTML फ़ाइलों से ASP.NET AJAX js फ़ाइल शामिल हो सकते हैं & समाधान पार मंच बनाते हैं।

तो सीधे अपने प्रश्न का उत्तर देने के लिए - यह पूरी तरह से बनाए रखने योग्य, कमजोर युग्मित वेब उपयोगकर्ता इंटरफेस बनाने की समस्या का एक व्यवहार्य समाधान है। और हां, आपके आवेदन का सर्वर पक्ष कम कर रहा है - यह एक सच्ची सेवा परत से अधिक हो जाता है, जहां यह सभी डेटा एक्सचेंज है। यह वास्तव में एक अच्छी बात है, बी/सी यह ग्राहकों में पुन: उपयोग को बढ़ावा देता है। डेटा भेजने/प्राप्त करने के लिए एक ही मध्यम स्तरीय सर्वर का उपयोग करके अपने WPF ऐप और अपने वेब ऐप की कल्पना करें? ग्राहकों के पास वैसे भी बहुत अधिक प्रसंस्करण शक्ति है - आपको समाधान को अधिक स्केलेबल बनाने के लिए इसका लाभ क्यों नहीं उठाएं (सर्वर जितना कम कर रहा है, उतना ही अधिक काम करेगा जो आपके क्लाइंट कर रहे हैं, जो सभी ग्राहकों में वितरित किया जाता है)

मुश्किल हिस्सा दो तरह से बाध्यकारी है - जहां आप इस घटना में हुक करते हैं कि कुछ ऑब्जेक्ट बदल गया है, और घटना है कि उपयोगकर्ता इंटरफ़ेस में कुछ बदल गया है (उदाहरण के लिए उपयोगकर्ता ने इनपुट नियंत्रण में कुछ टाइप किया है)। एक तरह से बाध्यकारी अभी भी उपयोगी होगा।

ऐसा लगता है कि माइक्रोसॉफ्ट एकमात्र कंपनी है जो अभी आपके इच्छित पैटर्न में एक पूर्ण समाधान का निर्माण कर रही है। याहू की वाईयूआई लाइब्रेरी डेटा बाध्यकारी करती है जो अर्ध-सुसंगत है, लेकिन आपके द्वारा बनाए गए WPF/Silverlight के समान पैटर्न में नहीं है।

+1

यह वास्तव में वास्तव में अच्छा है। मैं एक AdoDotNetDataContext में बंधे होने के बारे में थोड़े से चिंतित हूं। मैं अपने एमवीवीएम कार्यान्वयन के लिए फ्रेम काम में एक jQuery प्लग-इन दृष्टिकोण लेने जा रहा था। – Amir

+0

इन दिनों, एमएस तकनीक के साथ ठीक होने के कारण काले मौत के साथ ठीक है। – Jeff

1

मैं एक ऐसी ही अवधारणा का उपयोग कर रहा हूँ और JQuery Templating & DataLink (जोड़ा http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization- स्वीकार्य-के-आधिकारिक-jquery-plugins.aspx) समीकरणों को साफ विचारों और घोषणात्मक बाध्यकारी के तरीके के रूप में (बाध्यकारी भाग मुझे कुछ समस्याएं दे रहा है, लेकिन मुझे लगता है कि यह ठीक काम कर सकता है)।

इस परिदृश्य में इसका उपयोग करना जहां मुझे सेवाओं async का उपभोग करना है, और मैं वास्तव में इसे पसंद कर रहा हूं।

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

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