รับ System.Web.UI.Page ปัจจุบันจาก HttpContext?


85

นี่เป็นคำถามสองส่วน ขั้นแรก HttpContext.Current สอดคล้องกับวัตถุ System.UI.Page ปัจจุบันหรือไม่

และคำถามที่สองซึ่งอาจเกี่ยวข้องกับคำถามแรกคือเหตุใดฉันจึงไม่สามารถใช้สิ่งต่อไปนี้เพื่อดูว่าหน้าปัจจุบันใช้อินเทอร์เฟซ:

private IWebBase FindWebBase()
{
    if (HttpContext.Current as IWebBase != null)
    {
        return (IWebBase)HttpContext.Current.;
    }
    throw new NotImplementedException("Crawling for IWebBase not implemented yet");
}

บริบททั่วไปคือการควบคุมบางอย่างจำเป็นต้องทราบว่าพวกเขากำลังดำเนินการเป็นส่วนเว็บของ SharePoint หรือเป็นส่วนหนึ่งของกรอบงาน Asp.Net

ฉันได้แก้ไขปัญหาโดยกำหนดให้การควบคุมส่งผ่านการอ้างอิงถึงตัวมันเองและตรวจสอบคุณสมบัติเพจของตัวควบคุม แต่ฉันยังคงสงสัยว่าทำไมข้างต้นไม่ได้ผล

ข้อผิดพลาดของคอมไพเลอร์คือ: ไม่สามารถแปลง System.Web.HttpContext เป็น ... IWebBase ผ่านการแปลงอ้างอิงการแปลงแบบมวยการแปลงแบบ unboxing การแปลงการตัดหรือการแปลงประเภท null

คำตอบ:


144

ไม่จาก MSDN บน HttpContext.Current: "รับหรือตั้งค่าวัตถุ HttpContext สำหรับคำขอ HTTP ปัจจุบัน"

กล่าวอีกนัยหนึ่งก็คือวัตถุ HttpContext ไม่ใช่เพจ

คุณสามารถไปที่วัตถุเพจผ่าน HttpContext โดยใช้:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}

2
โหวตลงเนื่องจากไม่ถูกต้อง คำตอบด้วย HttpContext.Current.CurrentHandler ถูกต้อง! ถ้าคุณทำ Server.Transfer HttpContext.Current.Handler จะเป็นหน้าก่อนหน้านี้ HttpContext.Current.CurrentHandler จะเป็นหน้าปัจจุบัน
ไมค์

37

HttpContext.Handlerคุณกำลังมองหา เนื่องจากเพจใช้ IHttpHandler คุณจะได้รับการอ้างอิงไปยังเพจที่กำลังดำเนินการอยู่คุณจะต้องแคสต์หรืออย่างน้อยก็พยายามแคสต์ไปยังประเภทเฉพาะที่คุณต้องการ

HttpContext.Currentเพียงส่งคืนอินสแตนซ์ซิงเกิลตันของ HttpContext ดังนั้นจึงไม่ใช่และไม่สามารถเป็นหน้า


2
เพียงแค่แจ้งให้ทุกคนที่อ่านข้อความนี้ คำตอบด้านล่างเหมือนกัน แต่มีตัวอย่าง (เช่นคุณใช้ HttpContext.Current.Handler)
ไมค์เนลสัน

15

คุณอาจต้องการใช้HttpContext.Current.CurrentHandlerหากคุณต้องการให้หน้าที่แม่นยำที่กำลังดำเนินการอยู่ ตัวอย่างเช่นมีการส่งคำขอสำหรับ Default.aspx แต่มีข้อผิดพลาดเกิดขึ้นและคุณทำResponse.Transferกับเพจ ErrorHandler.aspx ที่กำหนดเองของคุณ CurrentHandlerจะส่งคืนอินสแตนซ์ของ ErrorHandler.aspx (หากเรียกหลังจากข้อผิดพลาด) ในขณะที่HttpContext.Current.Handlerจะส่งคืนอินสแตนซ์ของ Default.aspx


0

โปรดดูคำตอบของฉัน:
ทำไม HttpContext.Current.Handler จึงเป็นโมฆะ

อาจแก้ปัญหาของคุณได้


ฉันใช้รหัสเดียวกันในการทำงาน แต่ฉันรู้สึกรำคาญมากเพราะฉันไม่ทราบรายละเอียดของรายละเอียดการทำงาน ดังนั้นจึงพัฒนารหัสนี้สำหรับ worke ของฉัน ฉันคิดว่าใส่รหัสที่นี่เพื่อช่วยเพื่อนที่มีปัญหาของฉัน ขอบคุณ John Saunders
Amin Ghaderi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.