منع Postback عندما ينقر المستخدم على زر ظهر المتصفح

StackOverflow https://stackoverflow.com/questions/1791416

  •  22-09-2019
  •  | 
  •  

سؤال

لدي صفحة ويب ترسل بريدًا إلكترونيًا إلى عدة مستخدمين (قائمة توزيع عبر الإنترنت). بعد النقر فوق الزر "إرسال" وإرسال البريد الإلكتروني ، يتم عرض صفحة الحالة قائمة عدد رسائل البريد الإلكتروني التي تم إرسالها وأخطاء وغيرها من المعلومات. إذا انقر المستخدم على زر العودة ، فسيتم استياء البريد الإلكتروني. كيف يمكنني منع ذلك؟

ملاحظة: يطالب المتصفح المستخدم بـ "إعادة تقديم" أو "إعادة تقديم" البيانات إلى الصفحة قبل إرسال البريد الإلكتروني فعليًا ، لكن هذا لا يمنع المستخدمين من النقر فوقه ثم أتساءل عن سبب إرسال نسختين من البريد الإلكتروني.

بيئة:

  • الخادم: C#، ASP.NET 2.0 ، IIS6
  • العميل: أي متصفح (لا أريد حلًا محددًا مثل SmartNavigation)
هل كانت مفيدة؟

المحلول

في الكود الخاص بك ، مباشرة بعد إرسال رسائل البريد الإلكتروني ، قم بإعادة توجيه 302 إلى صفحة تأكيد:

protected void btnSend_Click(object sender, EventArgs e)
{
    SendManyEmails();
    Response.Redirect("confirmation.aspx");
}

مع هذا النوع من التعليمات البرمجية ، لن ينتهي المنشور إلى الصفحة الأصلية في تاريخ المتصفح.

يُعرف هذا النمط الشائع باسم بعد/إعادة توجيه/الحصول على نمط.

معلومات المكافأة حول الحفاظ على الحالة عند القيام بعد/إعادة التوجيه/احصل

العيب الرئيسي لهذا النمط هو أن جميع الحالة من معالجة طلب البريد يتم فقدانها عند إعادة توجيه المستخدم - وبالتالي ، بدء سياق طلب جديد. في ASP.NET ، يتضمن ذلك أعضاء داخل Page وكل Control الكائنات ، وكذلك كل شيء مخزن في ViewState.

إذا قمت بإنشاء نوع من "كائن الحالة" - ربما سجل لرسائل البريد المرسلة - أثناء التعامل مع طلب النشر ، فستحتاج إلى طريقة ما لحفظ هذا الكائن لطلب الحصول على التالي. بعض أطر الويب لديها وظائف خصيصًا لهذا: ROR HAV flash, ، ASP.NET MVC TempData. لا تحتوي نماذج ASP.NET على مثل هذا المفهوم المدمج ، لذلك سيتعين عليك اكتشاف شيء ما.

حفظ الكائن إلى Session في المنشور ، ستكون القراءة وحذفها على ما يلي طريقة واحدة لحل هذا. يمكنك إنشاء تجريد حول هذا إذا كنت تستخدمه في عدة أماكن ، أو يمكنك البحث في الويب للتطبيقات الحالية لـ Flash/TempData لنماذج ASP.NET.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top