منع Postback عندما ينقر المستخدم على زر ظهر المتصفح
-
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.