2009-01-25 9 views
6

Tôi đang cố sử dụng chức năng ASP.NET (3.5) "Routing Module" để tạo các trang tùy chỉnh dựa trên nội dung của URL.Tạo một System.Web.UI.Page lập trình trong IHTTPHandler

Các bài viết khác nhau, chẳng hạn như bài viết này: http://blogs.msdn.com/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx giải thích cách sử dụng Định tuyến ASP.NET để phân nhánh tới các trang hiện có trên máy chủ web.

Điều tôi muốn làm là tạo trang trực tuyến bằng mã.

nỗ lực đầu tiên của tôi trông như thế này:

public class SimpleRouteHandler : IRouteHandler 
{ 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string pageName = requestContext.RouteData.GetRequiredString("PageName"); 

     Page myPage = new Page(); 
     myPage.Response.Write("hello " + pageName); 
     return myPage; 

    } 

} 

Nhưng điều này ném một HTTPException nói "Phản ứng không có sẵn trong bối cảnh này." tại câu lệnh Response.Write.

Bất kỳ ý tưởng nào về cách tiến hành?

CẬP NHẬT: Cuối cùng, tôi đã đi với một phương pháp tiếp cận dựa trên IHttpModule, mà hóa ra là khá dễ dàng.

Trả lời

1

Thay vì cố viết trực tiếp vào phản hồi, bạn có thể chỉ cần thêm điều khiển vào trang. Vì trang là hoàn toàn mới và không có đánh dấu, bạn có thể phải thêm tất cả các phần tử HTML để làm cho HTML hợp pháp trở nên chính xác. Đã không bao giờ thử điều này, tôi không có ý tưởng nếu nó sẽ làm việc.

Page myPage = new Page(); 
page.Controls.Add(new LiteralControl("hello " + pageName)); 
return myPage; 

Không rõ ràng rằng điều này sẽ có các thẻ HTML, HEAD và BODY bắt buộc. Nó có thể là tốt hơn để tạo một trang cơ sở có đánh dấu bộ xương mà bạn chỉ có thể thêm các điều khiển của bạn và sử dụng BuildManager như trong ví dụ để khởi tạo trang này, sau đó thêm các điều khiển của bạn.

1

Đặt requestContext trước Response.Write, vì vậy requestContext.Response.Write

8

Bạn không thể viết thư cho các phản ứng từ một IRouteHandler - đó là cách quá sớm trong chu kỳ yêu cầu cuộc sống. Bạn chỉ nên viết thư cho câu trả lời từ trong số IHttpHandler, là số mà Page là.

Như được hiển thị trong các ví dụ khác, bạn sẽ phải nhận một phiên bản trang từ một nơi nào đó có tất cả nội dung cần thiết.

Đây là cách bạn có thể tải một trang hiện có:

Page p = (Page)BuildManager.CreateInstanceFromVirtualPath("~/MyPage.aspx"); 

Hoặc bạn có thể tạo một từ đầu:

Page p = new Page(); 
p.Controls.Add(new LiteralControl(
    @"<html> 
     <body> 
      <div> 
       This is HTML! 
      </div> 
     </body> 
     </html>")); 
+0

Tôi chỉ muốn cảm ơn bạn vì bạn gợi ý 'BuildManager.CreateInstanceFromVirtualPath'. Nó đã giúp tôi rất nhiều về điều tôi đang làm. –

+0

Trang p = (Trang) BuildManager.CreateInstanceFromVirtualPath ("~/MyPage.aspx", typeof (Trang)); –