[C#] لماذا هو المستخدم (كما هو الحال في User.Identity.Name) نول في بلدي وحدة تحكم أساس مجردة؟


Answers

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

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

الآن يعمل كما هو متوقع وليس لدي رمز المتكررة.

Question

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

لذلك ما أريد القيام به هو تمرير البيانات (اسم المستخدم الخاص بي مخصص كما تم تخزينها في ديسيبل) إلى لوجينوسركونترول. هذا تسجيل الدخول يحصل المقدمة من الصفحة الرئيسية عبر Html.RenderPartial ()، لذلك ما أنا حقا بحاجة إلى القيام به هو التأكد من أن أقول فيوداتا ["وسرنيكنام"] موجود على كل مكالمة. ولكن أنا لا أريد لملء فيوداتا ["أوزرنيكنام"] في كل عمل من كل وحدة تحكم، لذلك قررت استخدام هذا النهج وخلق تحكم قاعدة مجردة التي سوف تفعل العمل بالنسبة لي، مثل ذلك:

public abstract class ApplicationController : Controller
    {
        private IUserRepository _repUser;

        public ApplicationController()
        {
            _repUser = RepositoryFactory.getUserRepository();
            var loggedInUser = _repUser.FindById(User.Identity.Name); //Problem!
            ViewData["LoggedInUser"] = loggedInUser;
        }
    }

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

حتى الان جيدة جدا. الآن للمشكلة:

لا أستطيع الاتصال User.Identity.Name لأن User بالفعل فارغة. هذا ليس هو الحال في كل من بلدي وحدات تحكم مشتق، لذلك هذا هو محدد للتحكم قاعدة مجردة.

أنا تعيين User.Identity.Name عبر فورمزوثنتيكاتيون في مكان آخر في التعليمات البرمجية، ولكن أعتقد أن هذا لا يمكن أن يكون المشكلة - يمكن أن يكون المستخدم أفيك User.Identity.Name فارغة، ولكن ليس المستخدم نفسه.

يبدو لي مثل هتبكونتيكست غير متوفر (منذ أيضا نول ؛-) وأنني في عداد المفقودين نقطة بسيطة لكنها مهمة هنا. يمكن لأي شخص يعطيني بعض التلميحات؟ وسأكون ممتنا حقا.




الاتصال من منشئ في وقت مبكر جدا في خط أنابيب مفك.

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

من المثال الخاص بك أود أن تفعل شيئا من هذا القبيل:

public abstract class ApplicationController : Controller {
    private IUserRepository _repUser;

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        _repUser = RepositoryFactory.getUserRepository();
        var loggedInUser = _repUser.FindById(filterContext.HttpContext.User.Identity.Name); //Problem!
        ViewData["LoggedInUser"] = loggedInUser;
    }


}



يمكنك انتزاع هذا باستخدام شيء من هذا القبيل:

HttpContext currentContext = HttpContext.Current;
string userName = currentContext.User.Identity.Name;

أو هو هتبكونتيكست فارغة دائما ؟؟

هل يمكن تعيين هتبكونتيكست من خلال منشئ الفئة المجردة؟ واستخدامها بهذه الطريقة؟




أنا أفعل ذلك في تنفيذ باسكونترولر ويعمل كما هو متوقع.

public abstract class BaseController : Controller
{
    public bool LoggedOn
    {
        get { return User.Identity.IsAuthenticated; }
    }
}

هذا دائما يعود صحيح أو خطأ بالنسبة لي لذلك User != null