代码之家  ›  专栏  ›  技术社区  ›  ObiWanKenobi

在ihttphandler中以编程方式创建system.web.ui.page

  •  6
  • ObiWanKenobi  · 技术社区  · 17 年前

    我正在尝试使用asp.net(3.5)“路由模块”功能来创建基于url内容的自定义页面。

    各种文章解释了如何使用asp.net路由来分支到web服务器上的现有页面。

    我想做的是使用代码动态创建页面。

    我的第一次尝试是这样的:

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

    但这会在response.write语句中抛出一个HttpException,称“response在此上下文中不可用”。

    如何进行?

    更新: 最后,我使用了一种基于ihttpmodule的方法,结果发现这种方法相当简单。

    3 回复  |  直到 7 年前
        1
  •  8
  •   Eilon    16 年前

    你不能给 IRouteHandler -这在请求生命周期中太早了。您应该只在 IHttpHandler ,这就是 Page 是。

    如其他示例所示,您必须从具有所有必要内容的某个位置获取页面实例。

    以下是如何加载现有页面的方法:

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

    或者可以从头开始创建:

    Page p = new Page();
    p.Controls.Add(new LiteralControl(
        @"<html>
          <body>
              <div>
                  This is HTML!
              </div>
          </body>
          </html>"));
    
        2
  •  1
  •   tvanfosson    17 年前

    您可能只想向页面添加控件,而不是试图直接写入响应。由于页面是全新的,没有标记,您可能需要添加所有的html元素,使之成为合法的html,以便正确地呈现它。我从来没有试过这个,不知道它能不能用。

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

    我不清楚它是否有所需的html、head和body标记。最好创建一个具有框架标记的基页,您只需将控件添加到该基页,并像示例中那样使用buildmanager来实例化该页,然后添加控件。

        3
  •  1
  •   Ciaro    16 年前

    将requestContext放在response.write之前,因此requestContext.response.write