الحفاظ على ViewData بين مكالمات RenderAction
-
05-07-2019 - |
سؤال
أقوم بإعداد نموذج تسجيل الدخول المشترك باستخدام html.renderaction ، في كل صفحة من صفحات موقعي.
إذا قام المستخدم بإدخال تفاصيله في صندوق النص ونقر فوق "إرسال" ، فإنه يقوم بتشغيل إلى وحدة تحكم تتولى تسجيل الدخول.
إذا ارتكبوا خطأً ، مثل إدخال عنوان بريد إلكتروني غير صالح ، فسيقوم بملء الطراز باستخدام رسالة خطأ ثم إعادة توجيه إلى أي صفحة كانوا عليها من قبل.
المشكلة هي ، لأن RenderAction يحدث كطلب منفصل ، أفقد ViewModel.
حتى عندما أضعها في TempData ، تضيع ، نظرًا لأن TempData يتم مسحها على كل طلب منفصل.
هل هناك طريقة للحفاظ على البيانات بين مكالمات HTML.RenderAction المتتالية؟
إذا لم يكن الأمر كذلك ، أي اقتراحات حول كيف يمكن أن أتمكن من اختراق هذا؟ (يجب وضع البيانات في الجلسة؟)
المحلول
إليك ما فعلته في الوقت الحالي. (ربما هذا ليس الحل الأمثل.)
لقد قمت بإنشاء "PreserveViewDataattribute" ، والتي وضعتها في أي إجراء أريد الحفاظ على ViewData في الجلسة.
في بلدي basecontroller ، قمت بتجاوز طريقة "إعادة التوجيه" بطريقتي الخاصة ، والتي تفعل ما يلي.
يحصل على إشارة إلى طريقة الإجراء التي أطلق عليها (القليل من الانعكاس هنا)
يتحقق إذا كانت هذه الطريقة تحتوي
إذا كان الأمر كذلك ، يقوم بنسخ ViewData الحالي إلى متغير جلسة. (تسمية المتغير هي نفس اسم الإجراء الحالي ، مع وضع '_viewdata' في النهاية.)
في كلتا الحالتين ، تستدعي طريقة إعادة التوجيه الأساسية.
ثم قمت بإنشاء خاصية في 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