3

次のようなことを試しました:

HttpApplication app = s as HttpApplication; //s is sender of the OnBeginRequest event
System.Web.UI.Page p = (System.Web.UI.Page)app.Context.Handler;
System.Web.UI.WebControls.Label lbl = new System.Web.UI.WebControls.Label();
lbl.Text = "TEST TEST TEST";
p.Controls.Add(lbl);    

これを実行すると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されます。最後の行に...

元のファイルの特定の場所に 2 行のテキスト (asp.net/html) を挿入するにはどうすればよいですか? そして、どうすればファイルの拡張子を把握できますか (これを aspx ファイルにのみ適用したいのですが...?

4

4 に答える 4

6

あなたが考えるよりも簡単です:

    public void Init(HttpApplication app)
    {
        app.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
    }

    private void OnPreRequestHandlerExecute(object sender, EventArgs args)
    {
        HttpApplication app = sender as HttpApplication;
        if (app != null)
        {
            Page page = app.Context.Handler as Page;
            if (page != null)
            {
                page.PreRender += OnPreRender;
            }
        }
    }

    private void OnPreRender(object sender, EventArgs args)
    {
        Page page = sender as Page;
        if (page != null)
        {
            page.Controls.Clear(); // Or do whatever u want with ur page...
        }
    }

PreRender イベントが十分でない場合は、必要なイベントを PreRequestHandlerExecute EventHandler に追加できます...

于 2010-06-04T14:31:55.027 に答える
4

よくわかりませんが、HttpModule を使用してページのコントロール ツリーを変更できるとは思いません (間違っている場合は訂正してください)。HTML マークアップを変更することはできますが、これには「応答フィルター」を作成する必要があります。例については、http://aspnetresources.com/articles/HttpFilters.aspx を参照する、「httpmodule 応答フィルター」については google を参照してください。

于 2008-12-02T08:37:07.403 に答える
1

HttpFilter ソリューションがここでトリックを行っているようです:o)

MOSS/.net 2.x+ を使用していれば、Runes バージョンを使用したり、マスター ページにタグを追加したりできたはずです...

スーパーの提案とソリューションのテストの後、実際の問題を解決しているように見えるので、miies.myopenid.comのソリューションを受け入れます

于 2008-12-03T07:34:28.230 に答える
0

IIS6 または 5 と比較して、IIS7 で HttpModules を記述する方法にいくつかの変更があったため、IIS7 を使用している場合、私の提案は有効ではない可能性があります。

HttpContext の Current 静的プロパティを使用すると、現在のコンテキストへの参照を取得できます。HttpContext クラスには、リクエスト (HttpRequest タイプ) とレスポンス (HttpResponse) の両方のプロパティがあり、処理するイベント (Application.EndRequest かな?) に応じて、これらのオブジェクトに対してさまざまなアクションを実行できます。

配信されるページのコンテンツを変更したい場合は、おそらくこれをできるだけ遅くしたいので、EndRequest イベントに応答するのがおそらくこれを行うのに最適な場所です。

要求されたファイルの種類を確認するには、System.IO.Path クラスと共に Request.Url プロパティを確認します。次のようなことを試してください:

string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");

コンテンツの変更はより困難です。Context オブジェクトのイベントの 1 つでできるかもしれませんが、よくわかりません。

考えられるアプローチの 1 つは、Context.Items コレクションの値をチェックする独自のカスタム Page 派生クラスを作成することです。この値が見つかった場合は、Label を PlaceHolder オブジェクトに追加して、ラベルのテキストを任意のものに設定できます。

このようなものが動作するはずです:

次のコードを HttpModule 派生クラスに追加します。

public void Init(HttpApplication context)
{
  context.BeginRequest += new EventHandler(BeginRequest);
}

void BeginRequest(object sender, EventArgs e)
{

  HttpContext context = HttpContext.Current;
  HttpRequest request = context.Request;

  string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
  string extension = System.IO.Path.GetExtension(requestPath);
  bool isAspx = extension.Equals(".aspx");

  if (isAspx)
  {
    // Add whatever you need of custom logic for adding the content here
    context.Items["custom"] = "anything here";
  }

}

次に、次のクラスを App_Code フォルダーに追加します。

public class CustomPage : System.Web.UI.Page
{
  public CustomPage()
  { }

  protected override void OnPreRender(EventArgs e)
  {
    base.OnPreRender(e);

    if (Context.Items["custom"] == null)
    {
      return;
    }

    PlaceHolder placeHolder = this.FindControl("pp") as PlaceHolder;
    if (placeHolder == null)
    {
      return;
    }

    Label addedContent = new Label();
    addedContent.Text = Context.Items["custom"].ToString();
    placeHolder .Controls.Add(addedContent);

  }

}

次に、次のようにページを変更します。

public partial class _Default : CustomPage

継承が System.Web.UI.Page から CustomPage に変更されていることに注意してください。

最後に、カスタム コンテンツが必要な場所に PlaceHolder オブジェクトを aspx ファイルに追加します。

于 2008-12-02T09:21:59.903 に答える