2012-03-21 16 views
5

मैं एक ASP.NET MVC 3 आवेदन जो एक पोस्ट कार्रवाई Create कहा जाता है की है। क्या जावास्क्रिप्ट के उपयोग और बटन को अक्षम किए बिना इसे रोकने का कोई तरीका है, मैंने सोचा कि RedirectToAction का उपयोग करने का पूरा उपयोग पोस्ट/रीडायरेक्ट/डिज़ाइन पैटर्न का उपयोग करके इसे रोकने के लिए था?रोकें डबल फ़ॉर्म सबमिशन

+1

क्या आप बस कुछ (जैसे context.Issues.Exists (तर्क)) जोड़ सकते हैं? –

+1

क्लिक करते समय सबमिट बटन को बस अक्षम करें! – gdoron

+0

Exists नामक ऐसी कोई विधि नहीं है? – CallumVass

उत्तर

4

पैटर्न आप (पोस्ट/रीडायरेक्ट/डिजाइन प्रतिरूप जाओ) का उल्लेख होने से बचाता है पेज डबल पोस्टिंग से ताज़ा करता है क्योंकि अंतिम क्रिया एक है, न कि पोस्ट है।

आप डबल पोस्टिंग से दो बार क्लिक रोकना चाहते हैं आप:

1. Disable the button after click 
2. Maintain a unique index on 'Issues' and look for duplicates 
3. Maintain something in session that gives you an indication of a double post 

और वहाँ शायद कुछ और तरीके ... मैं बटन को निष्क्रिय करने लगता है कि शायद इसलिए कि आप सबसे आसान है वैसे भी किसी अन्य पेज पर रीडायरेक्ट कर रहे हैं।

+0

यह उपर्युक्त उदाहरण के लिए ठीक है, लेकिन जिस बिंदु पर मैं प्राप्त कर रहा था वह अधिक उन्नत उदाहरणों के लिए है, उदाहरण के लिए Ajax.BeginForm जो केवल पृष्ठ के हिस्से को अपडेट करेगा – CallumVass

+0

@ बिफबैफ़बॉफ़ - क्लाइंट साइड (AJAX POST) पर डबल क्लिकिंग को रोकने के लिए, आप केवल यूआई को अवरुद्ध कर सकते हैं जब तक कि प्रतिक्रिया वापस न आए (सिंक्रोनस), या बटन को अक्षम करें (एसिंक्रोनस), या इसे पहचानने के लिए कुछ सर्वर-साइड लागू करें। –

+0

हाय क्रिस, यह वही है जो मैंने अभी किया है। जब तक प्रतिक्रिया वापस आ गई है तब तक मैंने बटन को अक्षम कर दिया है। एक बार फिर धन्यवाद – CallumVass

1

जब आप उपयोगकर्ता को फॉर्म दिखाते हैं तो आप कोई समस्या उत्पन्न कर सकते हैं, फिर जांचें कि आपके पास अपनी बनाएं विधि में ऐसी आईडी के साथ पहले से कोई समस्या नहीं है और, उदाहरण के लिए, ऐसे अनुरोध छोड़ दें।

if (ModelState.IsValid) 
{ 
    DateTime now = DateTime.Now; 
    if (Session["LastAdd"] == null || (now - (DateTime)Session["LastAdd"]).TotalMilliseconds > 1000) 
    { 
     //first time, or more than a second passed since last addition 
     context.Issues.Add(issues); 
     context.SaveChanges(); 
     Session["LastAdd"] = now; 
    } 
    return RedirectToAction("Index"); 
} 
+0

वैसे यह आईडी को जोड़ना जारी रखेगा क्योंकि IssueId मेरा पीके फ़ील्ड है इसलिए हर नए मुद्दे के लिए, इसमें एक नया आईडी (2, 3, 4, 5 इत्यादि ..) – CallumVass

2

सबसे आसान तरीका मैं के बारे में सोच सकते हैं सत्र का उपयोग है!

क्लिक होने पर सबमिट बटन को अक्षम करें। अंत।

$('submitButtonId').click(function(){ 
    $(this).prop('disabled', true); 
    $(this).attr('disabled', 'disabled'); // for jQuery versions < 1.6. 
}); 
+0

क्षमा करें, मैं सत्रों का उपयोग नहीं करता एक विंडोज प्रमाणीकरण अनुप्रयोग – CallumVass

+0

@ बिफबाफबॉफ़ - 'सत्र' चर का उपयोग शुरू करें। –

+0

@ बिफ सत्र चर के प्रमाणीकरण के साथ कुछ भी नहीं मिला। आपको इस तरह क्या लगता है? –

5

आसान समाधान:

+1

इस समाधान के साथ, यदि उपयोगकर्ता को क्लिक करने और सर्वर पर जानकारी अपलोड करने के बीच नेटवर्क समस्या है, तो फॉर्म में जानकारी को सहेजने का कोई तरीका नहीं है। यदि उपयोगकर्ता ने फॉर्म भरने में 5 मिनट बिताए हैं तो वे परेशान होंगे। एक बेहतर तरीका शायद तब तक अक्षम होना है जब तक कि नेटवर्क सफल न हो या विफल हो जाए। –

+0

यह जावास्क्रिप्ट अक्षम के साथ काम नहीं करेगा? –

+0

@AlexAngas, जावास्क्रिप्ट अक्षम होने पर कुछ भी काम नहीं करेगा। मुझे नहीं लगता कि जेएस के बिना ऐसा करने का एक अच्छा तरीका है। (नीचे _Shadow Wizard_ उत्तर हार्ड कोडिंग 1000 एमएस है, जो आदर्श होने से बहुत दूर है, क्या होगा यदि उपयोगकर्ता के पास धीमी नेटवर्क कनेक्शन है?) – gdoron

0

पीआरजी पैटर्न इसे रोक नहीं पाएगा, क्योंकि इसमें पी कार्रवाई में समय लगता है (जो आमतौर पर मामला होता है) और उपयोगकर्ता फिर से फॉर्म सबमिट कर सकता है (क्लिक या ब्राउज़र रीफ्रेश के माध्यम से), जिससे पीआरजी पैटर्न का कारण बन जाएगा "असफल"।

ध्यान दें कि दुर्भावनापूर्ण उपयोगकर्ता त्वरित उत्तराधिकार में एकाधिक http पोस्ट चलाकर अपने सभी क्लाइंट साइड उपायों को भी बाईपास कर सकते हैं।

उपर्युक्त सभी का समाधान निम्न विधि का उपयोग करके सर्वर पक्ष पर डुप्लिकेट सबमिशन की जांच करना है, जैसा कि स्वयं द्वारा वर्णित है, here

आपकी सुविधा के लिए, मैं बोली:

"यदि आप अपने फार्म में एक छिपे हुए विरोधी जालसाजी टोकन का इस्तेमाल करते हैं तो (जैसा कि आप चाहिए), आप विरोधी जालसाजी टोकन पर कैश कर सकते पहले प्रस्तुत और कैश से टोकन हटाने यदि आवश्यक हो, या समय की निर्धारित राशि के बाद कैश की गई प्रविष्टि समय सीमा समाप्त हो।

फिर आप कैश के खिलाफ प्रत्येक अनुरोध के साथ जांच करने के लिए सक्षम हो जाएगा कि क्या विशिष्ट रूप प्रस्तुत किया गया है और इसे अस्वीकार अगर यह है। "

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