6

global.asax Application_EndRequest 関数内からページ オブジェクトにアクセスする方法はありますか?

リクエストの最後にラベルのテキストを設定しようとしていますが、ページにアクセスするのが思ったより難しいことがわかりました。

ここに私が持っているものがありますが、現在は機能していません:

protected void Application_BeginRequest(Object sender, EventArgs e)

    {

        Context.Items.Add("Request_Start_Time", DateTime.Now);

    }

    protected void Application_EndRequest(Object sender, EventArgs e)
    {

        TimeSpan tsDuration = DateTime.Now.Subtract((DateTime)Context.Items["Request_Start_Time"]);

        System.Web.UI.Page page = System.Web.HttpContext.Current.Handler as System.Web.UI.Page;
        if (page != null)
        {
            Label label = page.FindControl("lblProcessingTime") as Label;
            if (label != null)
            {
                label.Text = String.Format("Request Processing Time: {0}", tsDuration.ToString());
            }
        }
    }

page はここでは常に null です。

前もって感謝します。

4

3 に答える 3

6

すべてのページが継承するBasePageクラスを作成するのがおそらく最善です。次に、ページのUnloadイベント内にコードを配置でき、問題は発生しません。

于 2009-01-26T17:32:55.393 に答える
0

これは、Application_Start および Application_End では実行できません。

MSDN から:

Application_Start および Application_End メソッドは、HttpApplication イベントを表さない特別なメソッドです。ASP.NET は、各 HttpApplication インスタンスではなく、アプリケーション ドメインの有効期間中に 1 回呼び出します。

http://msdn.microsoft.com/en-us/library/ms178473.aspx

于 2009-01-26T18:22:16.060 に答える
0

リクエストのライフ サイクルのこの段階では、ページは既にレンダリングされており、ページ オブジェクトは使用できません。以前のイベントを使用する必要があります。

とはいえ、このアプローチには多くの問題があるため、お勧めしません。

FindControl を使用しています。コントロールの名前が変更されると、このコードは壊れます。

このコードは、ページだけでなく、これを実行する必要がある特定のページだけでなく、あらゆる要求に対して実行されます。

このコードは、タイプ セーフな方法でラベルにアクセスできるマスター ページまたはページ基本クラスにある必要があります。

于 2009-01-26T18:37:54.810 に答える