2009-07-12 22 views
5

में डेटा बदल हम सार्वभौमिक ASP.NET MVC में रूपों पर बदली हुई डेटा को संभालने के लिए की जरूरत है। हमारे आवेदन में ~ 100 रूप हैं, और उपयोगकर्ता को एक फॉर्म संपादित करना शुरू करना चाहिए और सहेजें (यानी जैसे कुछ भी) पर क्लिक करें, "आपका डेटा बदल दिया गया है। फॉर्म पर वापस जाने के लिए ठीक क्लिक करें, या खोने के लिए रद्द करें सभी परिवर्तन। ")। (जबकि एक प्रश्न पूछ) जावास्क्रिप्ट का उपयोगका पता लगाने/हैंडलिंग ASP.NET MVC/jQuery/जे एस

यह अतः तरह लग रहा है इस लागू करता है। सामान्य में, क्या यह सबसे अच्छा तरीका है? इसके अलावा, इस पर कोई सुझाव है कि इसे कैसे कार्यान्वित किया जाए?

उत्तर

1

जावास्क्रिप्ट यह करने के लिए आपका एकमात्र शॉट है। यह कोड का एक जटिल गुच्छा भी नहीं होना चाहिए। यदि प्रपत्र (var formEdited = false; करना होगा) संपादन चरणों में है आपको बस इतना करना है ध्वज को एक वैश्विक चर राशि है, और फिर इसे अपने पृष्ठ में स्निपेट शामिल:

window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
     if (formEdited) 
     { 
       return "You have attempted to leave this page. If you have made any changes to the fields without Submitting the form, your changes will be lost. Are you sure you want to exit this page?"; 
     } 
      // no changes - return nothing  
    } 
+1

बेशक jQuery/प्रोटोटाइप/अन्य पुस्तकालयों का भी उपयोग किया जा सकता है, लेकिन मूल कार्यान्वयन उपरोक्त स्निपेट जितना सरल है। – synhershko

4

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

मुझे संदेह है कि ऐसा करने के लिए एक jQuery प्लगइन है, लेकिन मैंने इसे लागू नहीं किया है क्योंकि मैंने jQuery का उपयोग करना शुरू कर दिया है। मेरा पहले कोड प्रोटोटाइप का इस्तेमाल किया।

संपादित करें: एक jQuery प्लगइन नहीं मिला, लेकिन मैं इसे अभी याद कर सकता था। यहां एक नमूना है कि मैं इसे कैसे कर सकता हूं। जाहिर है, और भी किया जा सकता है। नोट मैं इसे शुद्ध jQuery के साथ काम करने में सक्षम नहीं था - निश्चित रूप से क्यों नहीं, पॉपअप दो बार दिखाई देगा।

यह सभी इनपुट तत्वों के साथ काम करना चाहिए। हालांकि, आप बटन को अनदेखा/संभालने के लिए इसे बदलना चाहते हैं। मैंने केवल सबमिट बटन को अनदेखा करने के लिए इसे समायोजित किया है (इसलिए यह पॉपअप के बिना वापस पोस्ट कर सकता है)। यदि अन्य बटन प्रकार पृष्ठ को अनलोड कर सकते हैं, तो आपको उसे संबोधित करने की आवश्यकता हो सकती है।

var CheckOnClose = function() { 
    this.initialize(); 
} 

CheckOnClose.prototype = { 
    submitting: false, 
    initialize: function() { 
     var that = this; 
     window.onbeforeunload = function() { return that.checkLeavePage(); } 
    }, 
    isChanged: function() { 
     var changed = false; 
     $('input:not(:submit)').each(function() { 
      var iv = $(this).data('initialValue'); 
      if ($(this).val() != iv) { 
       changed = true; 
       return false; 
      } 
     }); 
     return changed; 
    }, 
    setSubmitting: function() { 
     this.submitting = true; 
    }, 
    checkLeavePage: function() { 
     if (!this.submitting && this.isChanged()) { 
      return 'You have some unsaved changes.'; 
     } 
    } 
} 

var checker = new CheckOnClose(); 

$(document).ready(function() { 

    $(':input:not(:submit)').each(function() { 
     $(this).data('initialValue',$(this).val()); 
    }); 
    $(':submit').click(function() { 
     checker.setSubmitting(); 
    }); 
}); 
+1

मेरा सुझाव है कि समारोह से पहले की जाँच करता है/मूल्यों को ऑनब्लूर ईवेंट से बुलाया जाता है ... इस तरह आप इसे आसानी से jquery ($ ('। check_changes') के साथ स्केल कर सकते हैं। धुंध (func);)। इसे लोड करने के लिए, पेज लोड समय पर मैं प्रारंभिक मान को तत्व की एक नई संपत्ति में सहेजता हूं ... आप इसे jquery के माध्यम से भी कर सकते हैं। –

+0

मुझे यह जोड़ना चाहिए कि यदि यह फ़ंक्शन निर्धारित करता है कि तत्व बदल गया है, तो इसे पृष्ठ स्कोप पर एक isDirty चर को संशोधित करना चाहिए। फिर, जब आप यह तय कर रहे हैं कि उपयोगकर्ता को छोड़ने की अनुमति देना है या नहीं, तो आपको केवल यह चर देखना होगा। –

+1

@jamesshannon - jQuery का उपयोग करके, मैं डेटा() विधि का उपयोग करने का सुझाव देता हूं और प्रारंभिक मान को इस तरह से स्टोर करता हूं। – tvanfosson