سؤال

أنا باستخدام PRG نمط لتجنب متعددة استمارة التقديم.لكن عيب خطير — لا يمكنك ببساطة echo رسالة تأكيد للمستخدم (ومن الواضح أن المستخدم لن انظر الصفحة ، وقال انه سيتم توجيهك إلى واحد آخر).

ما هي الحلول لهذه المشكلة ؟ أنا أعرف اثنين منهم ، ولكن أيا منها لا يبدو مثاليا.

  • استخدام مخصص إعادة توجيه URL ، مثل: http://example.com/?msg=data-saved.إنه عديم الجنسية ، لذلك اعتقد انها موثوقة جدا.ولكنه يخلق مشاكل عند المستخدم نسخ الرابط ، والعناوين ، إلخ.
  • متجر دورة متغيرة/كوكي و التحقق من ذلك على كل تحميل الصفحة.إذا كان مجموعة من الواضح أنه عرض الرسالة.يبدو حسنا, لكنني لست متأكدا من هذا — لأنه يعتمد بشدة على ملفات تعريف الارتباط, انها قليلا أكثر تعقيدا.

أو ربما هناك طرق أخرى لا أعرفها ؟ بعض مزيج من الدورات URL المعلمات ؟ دونو.

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

هل كانت مفيدة؟

المحلول

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

أيضا جلسة معالجة واحدة من تلك الأشياء التي ويب إطار التنمية عادة ما يهتم لك.

نصائح أخرى

هناك العديد من تجاوز سعة مكدس الأسئلة التي تعمل باللمس على هذا, على الرغم من أنني لا أعتقد أن أي تلخيص المشكلة بوضوح.وهنا عدد قليل:

معظم مريحة حلول الدورة أو أكثر عيوب خطيرة (مثل تضمين رسالة في querystring).

إذا كنت لا يمكن أن يضمن أنه سيكون لديك دورات أخرى (مكلفة جدا) طريقة إعادة توجيه إلى وجهات نظر مختلفة اعتمادا على نتائج استمارة التقديم.على سبيل المثال ، قد إعادة توجيه إلى EditWidgetView, EditWidgetSaveSuccessfulView, أو EditWidgetSaveErrorView (أو ربما كنت فقط لا إعادة توجيه على أخطاء).في بعض اللغات أطر هذا غير عملي إلى حد يجعلك تتخلى عن عرض تأكيد / رسائل خطأ على الإطلاق, ولكن في حالات أخرى قد يكون يستحق كل هذا العناء.

إذا كنت لا تريد أن تعتمد على دورات لأي سبب من الأسباب يمكنك أن تستخدم على متغير / url مخصص ثم إذا كان هذا المتغير موجود ، والتحقق من الرجوع.إذا كان الرجوع هو الصحيح ، ثم عرض الرسالة.نعم, هذا يضيف الاعتماد على يشير إرسالها من أجل إظهار رسالة تأكيد, لكن على خلاف ذلك كنت تعتمد على دورات (أي حين موثوق بها ، صحيح 100% مثالية لجميع الحلول إما.)

و بصراحة بعض المواقع الكبيرة التي عادة ما تكون جيدة جدا حول هذا النوع من الشيء مجرد عصا "actiondone=true" في عنوان url.(لقد لاحظت Facebook يفعل ذلك في بعض الأماكن.)

ذلك يعتمد على منصة ما كنت تعمل على.

روبي على القضبان يدعو هذا فلاش[:إشعار] = "الخاص بك عمل", ASP.NET MVC يدعو هذا TempData["إشعار"] = "الخاص بك عمل"...

أساسا أنها مجرد تخزين البيانات في HttpSession واحد ذهابا وإيابا فقط.بهذه الطريقة يمكنك استرداد البيانات على ويب آخر طلب.

يأتي في وقت متأخر جدا بهذا النقاش..

يمكنك استخدام مزيج من اثنين من الخيارات المقترحة.

بعد طلب POST يتم توجيه العميل (303) إلى URL مشيرا إلى أنه قد تكون هناك رسالة استجابة لهذا الطلب:

Client: GET  http://example.com/foo.cgi
Server: 200  Ok

Client: POST http://example.com/bar.cgi
Server: 303  http://example.com/foo.cgi?msg=true

إذا كان msg الحجة true ستكون الرسالة بحثت في الدورة (إذا وجدت) مدرجة في استجابة إلى العميل.
إذا كان msg الحجة ! true (أو غير موجود) ، بحث خطوة تخطيها.

مع هذا الحل ، يمكنك منع الفعلية الرسالة التي تظهر في URL URL يشير فقط يمكن أن يكون هناك رسالة.أيضا الرسالة يتم عرض فقط عند الحاجة (=عندما وجدت في الدورة).

ميزة أخرى هي أن هذا الحل يسمح أيضا النقد السليم-الضوابط المدرجة مع استجابات HTTP.

يمكنني استخدام متغير جلسة الأسلوب.أنا حقا لا مثل تضمين رسائل خطأ عرض في URL ، خصوصا مع URL الموفرة/تبادل القضايا لك ملاحظة ، وأنا أحب أن إذا كان المستخدم يعيد تحميل الصفحة الوجهة ستكون نظيفة سبيل المثال.

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