2009-01-26 15 views
6

मेरे पास एक पारंपरिक 3 परत डिज़ाइन वाला एक वेब एप्लिकेशन (एएसपी.Net 3.5) है। यदि उपयोगकर्ता एक बटन पर क्लिक करता है तो एक पोस्टबैक होता है, कुछ मध्य और डेटा लेयर कोड चलता है, और स्क्रीन रीफ्रेश हो जाती है। यदि उपयोगकर्ता पहले पोस्टबैक पूरा होने से पहले कई बार बटन क्लिक करता है तो मेरा तर्क भ्रमित हो जाता है और ऐप एक अमान्य स्थिति में समाप्त हो सकता है। इसे रोकने के सर्वोत्तम तरीके क्या हैं?मेरी व्यावसायिक परत को भ्रमित करने से बार-बार पोस्टबैक को कैसे रोकें

मैं बटन को अक्षम करने के लिए जावास्क्रिप्ट का उपयोग कर सकता हूं लेकिन यह समस्या को छुपाता है। इसे संभालने के लिए मैं अपना व्यवसाय और डेटा परत कैसे बना सकता हूं?

+0

मैंने कुछ समय पहले कुछ पूछा ... http://stackoverflow.com/questions/305684/how-can-i-prevent-database-being-written-to-again-when-the-browser -does-a-reload – Marty

उत्तर

2

तीन सबसे लोकप्रिय तरीकों (जो अक्सर संगठनों ने मिलकर उपयोग किया जाता है) हैं:

  1. Disable submit buttons एक बार क्लिक किया/दबाया;
  2. बैक बटन समस्याओं से बचने के लिए POST+REDIRECT+GET का उपयोग करें; और
  3. Replace history in the browser ताकि आप वापस नहीं जा सकें (लेकिन इसका उपयोग कम से कम और अच्छे कारण से किया जाना चाहिए)।
1

अगर मैं क्रूरता से ईमानदार होना चाहता था, तो मैं कहूंगा कि ऐसा लगता है कि आप वेब पोस्टबैक के बारे में उलझन में हैं, न कि आपके आवेदन (यदि आप इसे लिख चुके हैं)। ;-)

यह कहा गया है कि, अन्य सुझावों के अलावा, मैं इस मामले में क्या करूँगा, इस रूप में छिपे हुए क्षेत्र में "टोकन" रखता है - जैसे कि GUID - जिसे वापस पोस्ट किया जाता है। काम को ट्रैक करने के लिए इसका इस्तेमाल करें और इसे केवल एक बार उपयोग करने की अनुमति दें। जैसे जब वापस पोस्ट किया गया, इसे सत्र भंडारण में रखें। प्रत्येक बार जब एक पोस्टबैक किया जाता है तो इस टोकन के लिए पहले सत्र की जांच करें, और यदि यह वहां है तो कुछ भी नहीं करें। यदि यह वहां नहीं है, तो इसे सत्र में संग्रहीत करें और कार्य करें। जब सत्र समाप्त होता है, टोकन स्वचालित रूप से दूर फेंक दिया जाता है। आसान। कुछ संकलित डेटाबेस टोकन से काफी बेहतर है।

  • Oisin
+0

मैं टोकन के लिए memcached के साथ कुछ बहुत समान कर रहा हूँ। GUID को फॉर्म पर एक छिपे हुए फ़ील्ड के रूप में शामिल करें, फिर जब इसे पोस्ट किया जाए, तो उसे memcached में जोड़ने का प्रयास करें। अगर जोड़ विफल रहता है, तो यह पहले से ही जोड़ा गया था, इसलिए कुछ भी नहीं करें। चाबियाँ थोड़ी देर के बाद समाप्त हो जाती हैं, और memcached विश्वसनीय नहीं है, लेकिन मैंने पहले ही रीडायरेक्ट-पोस्ट-पोस्ट लागू कर लिया है और सबमिट बटून के कभी-कभी डबल-क्लिक को संभालने के लिए कुछ चाहिए (आमतौर पर बड़े मालिकों द्वारा ...) –

0
  1. अक्षम सबमिट बटन एक बार क्लिक किया। यह आकस्मिक डबल क्लिक करें या नहीं कर पाएगा अधिक
  2. मैं आमतौर पर पोस्टबैक के बाद एक अलग URL को अनुप्रेषित आकस्मिक/जानबूझकर पृष्ठ ताज़ा से बचने के लिए।
  3. अंततः आपके डीबी सम्मिलन विधि में, डालने से पहले कुछ समय सीमा (शायद सेकंड में) के भीतर डाले गए समान डेटा की जांच करें। यदि डुप्लिकेट डेटा केवल सेकंड के भीतर डाला जाता है (या मिनट। जो भी आपकी स्थिति में सबसे ज्यादा समझ में आता है), चेतावनी संदेश दिखाएं और यदि उपयोगकर्ता को लगता है कि यह त्रुटि नहीं है तो उपयोगकर्ता फिर से सबमिट करें। (आप उपयोगकर्ता खाता है और जब में लॉग इन उपयोगकर्ता डेटा सबमिट कर रहा है, तो डुप्लिकेट डेटा की जांच के लिए उपयोगकर्ता किया जाता है जब इस विधि सबसे समझ में आता है।)
0

मैं इस समस्या एक जावास्क्रिप्ट क्लिक समारोह बटन को निष्क्रिय करने लिख समाधान कर लिया है:

MyButton.Attributes.Add("onclick", 
    "javascript:this.onclick=function(){return false;};"); 
0

हम सभी वेबसाइटों को अक्षम "सबमिट करें" बटन को देखा है जब आप उन पर क्लिक करें। यह अक्सर उपयोगकर्ताओं को बटन को कई बार क्लिक करने से रोकने के लिए किया जाता है। आम तौर पर यह बटन को अक्षम करने के लिए 'ऑनक्लिक' जावास्क्रिप्ट ईवेंट का उपयोग करके पूरा किया जाता है। एएसपी.नेट में, प्रत्येक सर्वर साइड आइटम में पहले से ही ऑनक्लिक इवेंट हैंडलर होता है जो सर्वर को इवेंट प्रोसेसिंग के लिए वापस कॉल करता है। ASP.NET में एक ही बात को पूरा करने के, आप आसानी से कर सकता है:

btnSubmit.Attributes.Add("onclick", "this.disabled=true;" + GetPostBackEventReference(btnSubmit).ToString()); 

जहाँ 'btnSubmit' प्रश्न में बटन का नाम है। यहां क्या होता है कि हम एक ऑनक्लिक घटना बनाते हैं जो दो चीजें करता है। सबसे पहले, यह उपयोगकर्ता ब्राउज़र में बटन को अक्षम करता है। दूसरी बात यह है कि सर्वर पर सामान्य पोस्टबैक ईवेंट जमा करें।

0

मुझे भी वही समस्या मिली जो मैंने नीचे की तरह हल की है।

फ़ाइल अपलोड करने के बाद यदि आप same page या some other page in your project पर रीडायरेक्ट करते हैं तो यह समस्या टाल जाएगी।

उदाहरण के लिए:

मेरे ASPX में

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="WebApplication.WebForm" %> 

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 

<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:FileUpload ID="FileUpload1" runat="server" /> 
      <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /> 
     </div> 
    </form> 
</body> 
</html> 

यहां तक ​​कि मैं एक ही समस्या मैं नीचे की तरह समाधान कर लिया है मिला है।

फ़ाइल अपलोड करने के बाद यदि आप अपने प्रोजेक्ट में एक ही पृष्ठ या किसी अन्य पृष्ठ पर रीडायरेक्ट करते हैं। एक बार रीडायरेक्शन प्रतिक्रिया के बाद वहां रीडायरेक्शन प्रतिक्रिया नहीं होगी।

मेरे ASPX

में

मेरे सी में पीछे

public partial class WebForm : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      string path = Server.MapPath("~"); 
      path = path + FileUpload1.FileName; 
      FileUpload1.SaveAs(path); 
      Response.Redirect("WebForm.aspx"); // Responce will be cleared. This Redirection will do the Trick 
      //Put the debugger and check it will work 
     } 
    } 

यहाँ, स्तोत्र सफलता दिखाने के लिए और त्रुटि संदेश सत्र का उपयोग करने का प्रयास करें।

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

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