لدي مشكلة تكرار Insert مع Updatepanel في c#

السلام عليكم

لدي نموذج تسجيل ويوجد زر "button" عند الضغط عليه المفترض أن يتم تسجيل معلومات المستخدم مرة واحدة في قاعدة البيانات لكن ما يحدث هو أن أمر Insert يتكرر مرتين مرة عند الضغط على الزر ومرة عند إعادة التوجيه إلى الصفحة التالية

هذا كود ال front-end

 <div class="modal-body">
 <asp:UpdatePanel ID="signup_updatePanel" UpdateMode="Always" runat="server">
 <ContentTemplate>

  <div class="form-group">
       <asp:RequiredFieldValidator ID="name_reqVal" ControlToValidate="signup_name" ValidationGroup="signup_val" ErrorMessage="لا يمكنك ترك حقل الاسم فارغاً" CssClass="small text-danger" Display="Dynamic" runat="server"></asp:RequiredFieldValidator>
       <asp:TextBox ID="signup_name" ValidationGroup="signup_val" CssClass="form-control" placeholder="الاسم" runat="server"></asp:TextBox>
   </div>
   <div class="form-group">
      <asp:RequiredFieldValidator ID="email_reqVAl" ControlToValidate="signup_mail" ValidationGroup="signup_val" ErrorMessage="البريد الإلكتروني مطلوب" CssClass="small text-danger" Display="Dynamic" runat="server"></asp:RequiredFieldValidator>
      <asp:TextBox ID="signup_mail" ValidationGroup="signup_val" TextMode="Email" CssClass="form-control" placeholder="البريد الإلكتروني" runat="server"></asp:TextBox>
    </div>
   <div class="form-group">
      <asp:RequiredFieldValidator ID="password_reqVal" ControlToValidate="signup_password" ValidationGroup="signup_val" ErrorMessage="كلمة المرور مطلوبة" CssClass="small text-danger" Display="Dynamic" runat="server"></asp:RequiredFieldValidator>
      <asp:TextBox ID="signup_password" ValidationGroup="signup_val" TextMode="Password" CssClass="form-control" placeholder="كلمة المرور" runat="server"></asp:TextBox>
   </div>
   <div class="form-group">
       <button id="signup_btn" validationgroup="signup_val" class="btn btn-primary btn-block shadow z3 has-hover" onserverclick="signup_btn_ServerClick" runat="server">تسجيل</button>
  </div>


 </ContentTemplate>
 </asp:UpdatePanel>
 </div>

كود ال Back-end

con.open();
SqlCommand signup_cmd = new SqlCommand("INSERT INTO Users(Name,Email,Password,Token) VALUES ( @name, @mail, @password, @Token)", con);
signup_cmd.Parameters.AddWithValue("@name", signup_name.Text);
signup_cmd.Parameters.AddWithValue("@mail", signup_mail.Text);
signup_cmd.Parameters.AddWithValue("@password", signup_password.Text);
signup_cmd.Parameters.AddWithValue("@Token", user_token);
int backResult = signup_cmd.ExecuteNonQuery();
if (backResult != 0)
{
   Session["signin_session"] = user_token;
   Response.Cookies["signin_cookie"].Value = user_token;
   Response.Cookies["signin_cookie"].Expires = DateTime.Now.AddDays(15);
   Response.Redirect("~/Account.aspx?alert=successSignup");
 }
con.close();

إذا كان هناك من يمكنه المساعدة فسأكون شاكراً

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

هذا لأن حدث الكلك يقدح مرتين،

كحل سريع افحص السجل إن لم يكن موجودا أضفه وإلا تجاهله. وبهذا في الاستدعاء الأول لن يجده وسيحفظه، في الاستدعاء المكرر سيجده ويتجاوزه.

أما كحل طبيعي فيتطلب الأمر البحث عن الاحتمالات المختلفة للاستدعاء المكرر وإيجاد الحلول المقترحة.

جرب وضع في الحقول أي صناديق النص

AutoPostBack="true"

افحص السجل إن لم يكن موجودا أضفه وإلا تجاهله

ما هو السجل الذي تقصده حضرتك؟

وعندما جربت وضع

AutoPostBack="true"

لم يعمل الزر ولم يقم بال Insert أو إعادة التوجيه

أقصد قبل عملية INSERT INTO قم بعمل عملية استفسار SELECT TOP 1 تسترجع فيها السجل بنفس القيم فإن عاد بنتيجة فهو موجود ومحفوظ ةإن عاد بقيمة فارغة فيعني أنه لم يحفظ بعد.

أها فهمت قصدك

لكنه هكذا دائما سيعود فارغا لأن جملة Insert ستنفذ بعد Select وهي تنفذ مرتين متتاليتين في نفس الوقت مرة أول الضغط على الزر ومرة أخرى عند إعادة التوجيه والذي يحدث مباشرة بعد الضغط على الزر

بعد تنفيذ سطر INSERT يكون السجل قد أصبح في القاعدة، يعني أن ال SELECT في المكرر سيجده

لقد توصلت لحل وكان بسيطا جدا :'D وهو إضافة

type="button"

للوسم button وقد حل هذا المشكلة.لكن سأجرب حل حضرتك أيضا للتجربة فقط

شكرا جزيلا لك م/عبدالرحمن.

ومرة عند إعادة التوجيه إلى الصفحة التالية

إذن يرسل البيانات مرة أخرى للسيرفر؟

هناك طريقة اخرى لإعادة التوجيه ،

إذن يرسل البيانات مرة أخرى للسيرفر؟

أجل أعتقد أن هذا ما يحدث

وعند تجربة إعادة التوجيه بإستخدام السيرفر أيضا حدثت نفس المشكلة

هل يمكنك تجربة و ربطه مع الحدث؟

zezo_mohamed أضف ردا

هل يمكنك تجربة و ربطه مع الحدث؟

تجربة إعادة التوجيه بإستخدام السيرفر أم تجربة ماذا بالضبط؟

عفواً ، يبدو انه لم يكتب الـtag

<asp:button>

لقد نجح الأمر شكرا لك أخي الكريم :)

لكن في المقابل حدثت بعض المشاكل مع تأثيرات الجافاسكربت التي أستخدمها عند الضغط على الزر :'D لكن لا مشكلة سأتعامل مع الأمر

في رأيك ما سبب حدوث هذه المشكلة مع الوسم button؟

horizon أضف ردا

لأن الـButton عند الضغط عليه يقوم بعملية Submit للسيرفر بشكل افتراضي كأنه input type="submit"

بينما asp:button يولد input type="button" و هذا لن يقوم بعملية الـSubmit

يمكنك تعطيل الـSubmit للزر بإستخدام JavaScript

zezo_mohamed أضف ردا

تمام جزيلا شكرا لك

إذا كنت مهمتا فقد حُلت المشكلة بإضافة

type="button"

للوسم button