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




asp.net-mvc controller user-controls httpcontext (8)

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

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

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

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

لذلك ما أريد القيام به هو تمرير البيانات (اسم المستخدم الخاص بي مخصص كما تم تخزينها في ديسيبل) إلى لوجينوسركونترول. هذا تسجيل الدخول يحصل المقدمة من الصفحة الرئيسية عبر 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 فارغة، ولكن ليس المستخدم نفسه.

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


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

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

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

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


شكرا ريمون. كنت متعبا جدا لرؤية واضحة. Keeney: نعم السياق دائما فارغ. وأشار ريمون لماذا. شكرا على أي حال، لم أكن أرى لماذا أيضا :-)

بلدي حل العمل الحالي (وإن لم يكن ما أردت) هو السمة التي يمكنني استخدامها لتزيين كل ما عندي من أعمال تحكم. هنا هو التنفيذ:

public class MasterPageDataAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            IUserRepository _repUser = RepositoryFactory.getUserRepository();
            IPrincipal siteUser = filterContext.Controller.ControllerContext.HttpContext.User;
            User loggedInUser = null;

            if (siteUser == null || siteUser.Identity.Name == null)
            {
                //do nothing
            }
            else
            {
                loggedInUser = _repUser.findUserById(siteUser.Identity.Name);
            }
            filterContext.Controller.ViewData["LoggedInUser"] = loggedInUser ?? new User { Nickname = "Guest" };
        }
    }

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

هتاف لذلك.


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

[CreateRepositoryByUser]
public class MFCController : Controller
{
    protected MFCRepository _repository
    {
        get { return ViewData["repository"] as MFCRepository; }
    }
...

_repository، في الواقع، ليس متغير خاص من وحدة تحكم، ولكن سوميثين إنشاء السمة:

public class CreateRepositoryByUser : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        CreateRepository(filterContext);
    }

    public static void CreateRepository(ActionExecutingContext filterContext)
    {
        if (filterContext.Controller.ViewData["repository"] == null)
        {
            filterContext.Controller.ViewData["repository"] =
                MFCRepository.CreateMFCRepository(filterContext.Controller.ControllerContext.HttpContext.User);
        }
    }
}

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


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

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

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

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;
    }


}

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

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

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


لم يتم تعيين الخاصية المستخدم حتى بعد مثيل وحدة تحكم، ولكن يمكنك الحصول على الوصول المبكر من منشئ الخاص بك مع:

System.Web.HttpContext.Current.User

كانت المشكلة في إصدار الحزم التالية:

يجب عليك تحديثه وسيتم حل المشكلة.







c# asp.net-mvc controller user-controls httpcontext