سؤال

أقوم بإعداد نموذج تسجيل الدخول المشترك باستخدام html.renderaction ، في كل صفحة من صفحات موقعي.

إذا قام المستخدم بإدخال تفاصيله في صندوق النص ونقر فوق "إرسال" ، فإنه يقوم بتشغيل إلى وحدة تحكم تتولى تسجيل الدخول.

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

المشكلة هي ، لأن RenderAction يحدث كطلب منفصل ، أفقد ViewModel.

حتى عندما أضعها في TempData ، تضيع ، نظرًا لأن TempData يتم مسحها على كل طلب منفصل.

هل هناك طريقة للحفاظ على البيانات بين مكالمات HTML.RenderAction المتتالية؟

إذا لم يكن الأمر كذلك ، أي اقتراحات حول كيف يمكن أن أتمكن من اختراق هذا؟ (يجب وضع البيانات في الجلسة؟)

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

المحلول

إليك ما فعلته في الوقت الحالي. (ربما هذا ليس الحل الأمثل.)

لقد قمت بإنشاء "PreserveViewDataattribute" ، والتي وضعتها في أي إجراء أريد الحفاظ على ViewData في الجلسة.

في بلدي basecontroller ، قمت بتجاوز طريقة "إعادة التوجيه" بطريقتي الخاصة ، والتي تفعل ما يلي.

  1. يحصل على إشارة إلى طريقة الإجراء التي أطلق عليها (القليل من الانعكاس هنا)

  2. يتحقق إذا كانت هذه الطريقة تحتوي

  3. إذا كان الأمر كذلك ، يقوم بنسخ ViewData الحالي إلى متغير جلسة. (تسمية المتغير هي نفس اسم الإجراء الحالي ، مع وضع '_viewdata' في النهاية.)

  4. في كلتا الحالتين ، تستدعي طريقة إعادة التوجيه الأساسية.

ثم قمت بإنشاء خاصية في BaseController تسمى "PreservedViewData" ، والتي تعيد ViewData في الجلسة ، ذات الصلة بالإجراء الحالي. (أو يعود لاغية إذا لم يتم العثور عليها).

وبالتالي ، للحفاظ على ViewData طالما أرغب ، أحتاج فقط إلى تزيين عملي مع "PreserveViewDataattribute" ، ثم اتصل بـ "ProservieDviewData" كلما احتجت إليه.

اسمحوا لي أن أعرف إذا كنت تريد رمز المصدر لهذا.

نصائح أخرى

قد ترغب في نهج قسم ما بعد REDIRECT-GET من قِبل Kazi Rashid.

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

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