asp.net MVC، كيفية إعادة توجيه المستخدمين المسجلين الذين ليس لديهم ملف شخصي إلى الصفحة؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

نحن نقوم ببناء موقع باستخدام asp.net mvc.نريد أن نسمح للمستخدم بالتسجيل وإنشاء حساب بسهولة.على الرغم من ذلك، هناك معلومة خاصة جدًا، سيتم تسجيلها في ملفه الشخصي، ونريد أن نعرضها له *بعد انتهاء التسجيل، وقيامه بتسجيل الدخول لأول مرة.

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

ستعتمد واجهة المستخدم بأكملها على اختيارات الملف الشخصي تلك.ما هو النهج الذي يجب أن نستخدمه ضمن إطار عمل MVC لفرض سير العمل هذا على الزائر؟تتطلب الأفكار التي يمكنني التوصل إليها الكثير من تكرار التعليمات البرمجية في وحدات التحكم وما إلى ذلك، لذلك من الواضح أنها فكرة سيئة.

نحن نستخدم العضوية للمستخدمين، ولكن الملف الشخصي هو التنفيذ الخاص بنا (لا يوجد موفر ملف تعريف) والذي سيربط بيانات الملف الشخصي بمعرف المستخدم.

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

المحلول

وأعتقد أن أسهل طريقة للقيام بذلك هي إما إنشاء مخصص AuthorizeAttribute، وتوسيع واحدة موجودة أو إنشاء FilterAttribute منفصلة. أي واحد من هؤلاء سوف تحصل تطبيقه على جميع وحدات التحكم الخاصة بك والتأكد من أن المستخدم مصادقة لديه ملف. في حالة عدم وجود الشخصية، فإن فلتر إعادة توجيه المستخدم إلى صفحة حيث يتم إنشاء ملف التعريف. يمكن القيام بذلك عن طريق تعيين الخاصية النتيجة على السياق إلى RedirectResult إلى عمل الخلق الشخصي. إلا إذا وجود الملف الشخصي واكتمال ان مرشح تسمح للمستخدم للشروع في الإجراء المطلوب.

وبدلا من ذلك، يمكنك إنشاء وحدة تحكم قاعدة أن يتجاوز OnActionExecuting ويؤدي نفس المهمة. انا افضل آلية السمة كما أنه أكثر مرونة، أي، هل يمكن أن يكون بعض الإجراءات العامة التي تتوفر بدون الملف (بما في ذلك العمل بضبط الوضع).

نصائح أخرى

الإجابة على سؤالي الخاص:في النهاية قمت بإنشاء مرشح إجراء مخصص.في البداية، سلكت طريق التصنيف الفرعي [authorize] إلى [AuthorizeCheckProfile].ولكن بعد ذلك أدركت أن حالة الاستخدام كانت خاطئة:لم أكن أرغب في إعادة توجيه الأجزاء التي تم تسجيل الدخول إليها فقط من موقعي إلى صفحة إنشاء ملف التعريف، في حالة عدم وجود ملف تعريف للمستخدم.أنا أردت أي صفحة من موقعي لإعادة التوجيه إلى تلك الصفحة، إذا كان مستخدمًا مسجل الدخول بدون ملف شخصي.المكان الوحيد الذي لا أريد التحقق منه هو إنشاء الملف الشخصي الفعلي.إليك الكود:

public class AssertProfileAttribute : ActionFilterAttribute {
    public AssertProfileAttribute() {
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Request.IsAuthenticated == false)
            return;
        //we have a user, but does he have a profile?
        if (filterContext.HttpContext.Session["UserProfile"] == null) { //not in the session
            IUnityContainer container = filterContext.HttpContext.Application["container"] as IUnityContainer;
            Profile hasProfile = container.Resolve<IProfileRepository>().GetUserProfile(Membership.GetUser());
            if (hasProfile == null) {
                //we have to redirect to the create profile 
                string returnURL = filterContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Profile", action = "Create", returnTo = returnURL }));
            } else {
                //he has a profile but we haven't put it in session yet
                filterContext.HttpContext.Session["UserProfile"] = hasProfile;
            }
        }
    }
}

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

شكر كبير للمجتمع.

وحاول النظر في تصفية العمل وتصفية السمة إذا لا تحتاج معظم صفحات للقيام بذلك، وإلا، قد وضعت في الواقع هذا المنطق إعادة توجيه إلى global.asax (في تلك بيغن طلب أو أحداث مشابهة)

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