6

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

しかし、これは「このコンテキストでは応答を使用できません」という HTTPException をスローします。Response.Write ステートメントで。

どうやって進める?

更新:最終的に、私は IHttpModule に基づくアプローチを採用しましたが、これはかなり簡単であることが判明しました。

4

3 に答える 3

8

からの応答に書き込むことはできません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>"));
于 2010-01-10T03:02:08.867 に答える
1

requestContext を Response.Write の前に置くので、requestContext.Response.Write

于 2010-01-10T02:40:20.477 に答える
1

応答に直接書き込もうとする代わりに、単にコントロールをページに追加したい場合があります。このページは真新しく、マークアップがないため、正しくレンダリングするには、すべての HTML 要素を追加して正当な HTML にする必要がある場合があります。これを試したことがないので、うまくいくかどうかわかりません。

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

これに必要な HTML、HEAD、および BODY タグが含まれるかどうかはわかりません。コントロールを追加できるスケルトン マークアップを持つベース ページを作成し、例のように BuildManager を使用してこのページをインスタンス化してから、コントロールを追加することをお勧めします。

于 2009-01-25T12:29:47.980 に答える