سؤال

وهذا قد لا يكون الطريقة الصحيحة لاستخدام وحدات التحكم، لكنني لم تلاحظ هذه المشكلة ولم ترد على وسيلة لتصحيح ذلك.

public JsonResult SomeControllerAction() {

    //The current method has the HttpContext just fine
    bool currentIsNotNull = (this.HttpContext == null); //which is false    

    //creating a new instance of another controller
    SomeOtherController controller = new SomeOtherController();
    bool isNull = (controller.HttpContext == null); // which is true

    //The actual HttpContext is fine in both
    bool notNull = (System.Web.HttpContext.Current == null); // which is false        

}

ولقد لاحظت أن HttpContext على وحدة تحكم ليست هي "الفعلي" HttpContext التي قد تجد في System.Web.HttpContext.Current.

هل هناك طريقة لتجميع HttpContextBase على وحدة تحكم يدويا؟ أو طريقة أفضل لإنشاء مثيل من وحدة تحكم؟

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

المحلول

لم يتم تصميم

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

نصائح أخرى

لوالآن أنا ذاهب إلى القيام بما يلي. هذا ويبدو أن الإصلاح مقبول ...

public new HttpContextBase HttpContext {
    get {
        HttpContextWrapper context = 
            new HttpContextWrapper(System.Web.HttpContext.Current);
        return (HttpContextBase)context;                
    }
}

وأين يضاف هذا إلى فئة تحكم هذه تحكم ويرث من.

وأنا لست متأكدا مما إذا كان HttpContext يتم فارغة هو السلوك المطلوب، ولكن هذا سوف إصلاحه في غضون ذلك بالنسبة لي.

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

ويمكنك العثور على نموذج تدفق الطلب في MVC asp.net على <لأ href = "http://www.codethinked.com/post/2008/09/27/ASPNET-MVC-Request-Flow.aspx "يختلط =" noreferrer "> هذا بلوق .

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

هل تريد استخدام بعض الوظائف من وحدة تحكم؟ أو لديك وحدة تحكم تنفيذ إجراء؟

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


return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });

هل تستخدم مصنع تحكم؟ إذا كان الأمر كذلك، كيف حالك تسجيل المكونات؟

وأنا واجهت هذه المشكلة حيث كنت قد وأضاف عن غير قصد الاعتماد على أساس HttpContext باعتباره سينغلتون، بدلا من عابر في وندسور.

وHttpContext كان لاغيا للجميع ولكن الطلب الأول. استغرق الأمر مني بعض الوقت لتعقب ان واحد.

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