ITエンジニア向け 情報館  
   

 

ASP.NET

ページイベント発生順序

注意点

  • WebPageとWebPageのコントロールには、それぞれ基底クラスを別途用意したうえで実装している。
  • OnPre****、On****Completeイベントは、Pageクラスにのみ存在する。マスターページやコントロールには存在しない。

Init系

  Exec WebFormのBase コンストラクタ
   ※この間にaspxページに張り付けたコントロールが生成される(ただしこの時点ではnull)
  Exec WebForm コンストラクタ
   ※この間にaspxページに張り付けたコントロールがPage.ControlにAddされる(コントロールツリーが生成)
  Start WebForm OnPreInit
    ※この間にページのPreInitイベントの時点では、マスターページやテーマは関連付けられていない。変更するならこのメソッド内で変更する。IsPostbackプロパティはこの時点で設定される。
    ※この間に明示的にIDプロパティを指定していない場合は、この時点ではIDの値は設定されていない。
  End WebForm OnPreInit
  Exec Masterpage コンストラクタ
  Exec Masterpageのコントロール コンストラクタ
  Exec WebPageのコントロール コンストラクタ
   ※この間にaspxページに張り付けたコントロールがインスタンス化され、aspxページに記述のプロパティ値が代入される
  Start Masterpageのコントロール OnInit
   Start Masterpageのコントロール Page_Init
   End Masterpageのコントロール Page_Init
  End Masterpageのコントロール OnInit
  Start Masterpageのコントロール TrackViewState
  End Masterpageのコントロール TrackViewState
  Start WebPageのコントロール OnInit
   Start WebPageのコントロール Page_Init
   End WebPageのコントロール Page_Init
  End WebPageのコントロール OnInit
  Start WebPageのコントロール TrackViewState
  End WebPageのコントロール TrackViewState
  Start Masterpage OnInit
   Start Masterpage Page_Init
   End Masterpage Page_Init
  End Masterpage OnInit
  Start Masterpage TrackViewState
  End Masterpage TrackViewState
  Start WebForm OnInit
    ※この時点ではマスターページとテーマは変更できない。
    ※この間にIDプロパティが設定されていない者に対して、それらの値が設定される。
   Start WebFormのBase OnInit
    Start WebForm Page_Init
    End WebForm Page_Init
   End WebFormのBase OnInit
  End WebForm OnInit
  Start WebForm TrackViewState
   Start WebFormのBase TrackViewState
   End WebFormのBase TrackViewState
  End WebForm TrackViewState
  Start WebForm OnInitComplete
  End WebForm OnInitComplete
   ※この間にこのあと、VIEWSTATEの内容が読み込まれ、コントロールのプロパティの値を設定する。
   ※この間にさらにそのあと、POSTされたデータがロードされ、コントロールのプロパティの値を設定する。

Load系、コントロール系(PostBack時のみ)

OnClickなどのイベントの前に、ここでのPage_Loadメソッドが先に呼び出される

※この間にこの時点で、ページの子コントロールの状態は適切に再現されており、子コントロールのプロパティなどにアクセスしても安全。
   ※この間にコントロールを動的に生成する場合は、このタイミングで行う。
  Start WebForm OnPreLoad
  End WebForm OnPreLoad
   ※この間に動的に生成したコントロールのプロパティに対して、ViewStateやポストバックデータを適用できるなら、このタイミングで行う??
  Start WebForm OnLoad
   Start WebFormのBase OnLoad
    Start WebForm Page_Load
    End WebForm Page_Load
   End WebFormのBase OnLoad
  End WebForm OnLoad
  Start Masterpage OnLoad
   Start Masterpage Page_Load
   End Masterpage Page_Load
  End Masterpage OnLoad
  Start Masterpageのコントロール OnLoad
   Start Masterpageのコントロール Page_Load
   End Masterpageのコントロール Page_Load
  End Masterpageのコントロール OnLoad
  Start WebPageのコントロール OnLoad
    ※この間にこの時点で、カスタムコントロールの子コントロールの状態は適切に再現されており、子コントロールのプロパティなどにアクセスしても安全。
    ※この間にコントロールを動的に生成する場合は、このタイミングで行う。
   Start WebPageのコントロール Page_Load
   End WebPageのコントロール Page_Load
  End WebPageのコントロール OnLoad
  Start WebForm OnLoadComplete
  End WebForm OnLoadComplete

このあとに、OnClickなどのイベントが実行される。

SaveViewState系

   ※この間にコントロールの状態を、ViewStateに書き込む
  Exec WebForm SaveViewState
  Exec WebFormのBase SaveViewState
  Exec Masterpage SaveViewState
  Exec Masterpageのコントロール SaveViewState
  Exec WebPageのコントロール SaveViewState

Render系

 

Start WebForm RenderControl
   Start WebFormのBase RenderControl
    Start WebForm Render
     Start WebFormのBase Render
      Start WebForm RenderChildren
       Start WebFormのBase RenderChildren
        Start Masterpage RenderControl
         Start Masterpage Render
          Start Masterpage RenderChildren
           Start Masterpageのコントロール RenderControl
            Start Masterpageのコントロール Render
             Start Masterpageのコントロール RenderChildren
             End Masterpageのコントロール RenderChildren
            End Masterpageのコントロール Render
           End Masterpageのコントロール RenderControl
           Start WebPageのコントロール RenderControl
            Start WebPageのコントロール Render
             Start WebPageのコントロール RenderChildren
             End WebPageのコントロール RenderChildren
            End WebPageのコントロール Render
           End WebPageのコントロール RenderControl
          End Masterpage RenderChildren
         End Masterpage Render
        End Masterpage RenderControl
       End WebFormのBase RenderChildren
      End WebForm RenderChildren
     End WebFormのBase Render
    End WebForm Render
   End WebFormのBase RenderControl
  End WebForm RenderControl

Pageクラスのイベント

Page_Init

コントロールの初期化実行に使用される。このイベントが実行されても、ビューステート情報はまだ生成されておらず、ページ上のコントロールに入力された値も設定されていない。
このイベントハンドラを通して、Webコントロールにアクセスすることはできない。
こうした制約から、このイベントに対してイベントハンドラを生成する必要はほとんどないと思われる。

Page_Load

ビューステート情報は生成され、Webコントロールにアクセスすることができる。

Page_PreRender

PageオブジェクトがASP.NETページをクライアントに返す前に実行される。
PreRenderイベントハンドラが実行された後、ビューステート情報を保存する。

Page_Unload

ページをクライアントに返した後、実行される。

ASP.NETページのライフサイクル

http://msdn.microsoft.com/ja-jp/library/ms178472(v=vs.100).aspx
http://www.atmarkit.co.jp/fdotnet/bookpreview/learnaspnet_0202/learnaspnet_0202_02.html

Page_Load → CustomValudatorなどの検証ロジック → 変更系イベント → アクション系イベント

セッションの破棄ロジックはPage_LoadCompleteイベントで

ページの終了処理を記述した場合(たとえばセッションを破棄するとか、グローバル変数を初期化するなど)、Page_UnloadまたはPage_LoadCompleteイベントにその処理を記述します。

ただし、Page_UnloadではRequestオブジェクトにアクセスできません。Page_UnloadイベントはHTTP処理が終わった後の処理記述となるためです。
したがってセッションの破棄を行う処理を書く場合には、Page_LoadCompleteイベントに書いたほうがよいです。

Page_LoadCompleteイベントではなく、Page_Loadイベントの末尾にセッション破棄を書いてしまうと、その後のマスターページの処理でセッションの読み込みに失敗したという経験が、私にはあります。
なのでこのエントリをメモ書きしました。

検証関連

CompareValidatorのOperatorの意味

GraterThanの指定が、どちらに対して>=しているのかわかりにくいが、要するに下記数式の通りになると理解すればよい。

[CompareValidator.ControlValidateの値] [CompareValidator.Operatorの記号] [CompareValidator.ControlToCompareの値]

例)
ControlToValidateプロパティに TextBox1を、
ControlToCompareプロパティに TextBox2を、
OperatorにGraterThanを指定すると、

TextBox1.Text >= TextBox2.Text

の結果を検証してくれることになる。

検証結果が何も表示されない場合

検証エラーが発生していないのに次の画面に進めず、ValidateSummaryコントロールに何も表示されない場合の対処法。

ボタンのクリックイベントで、本来

if (Page.IsValid==false) {
  return;
}

と書くところを、

if (Page.IsValid) {
  return;
}

と書いてしまっていることが原因。

カスタムコントロール・ユーザーコントロール

カスタムコントロール(ユーザーコントロール)に付加できる属性

DefaultValue プロパティの既定値を指定します。
Browsable [プロパティ] ウィンドウにプロパティやイベントを表示するかどうかを指定します。
Category プロパティまたはイベントをビジュアル デザイナで表示するカテゴリを指定します。
Description プロパティまたはイベントの説明を指定します。
DesignOnly プロパティを設定できるのがデザイン時だけかどうかを指定します。
ReadOnly この属性が関連付けられているプロパティがデザイン時に読み取り専用か、または読み書き可能かを指定します。
ParenthesizePropertyName 関連付けられているプロパティの名前をかっこで囲んで [プロパティ] ウィンドウに表示するかどうかを示します。

例:
[Description("説明が表示されます。")] 
public int Description { 
  get { return description; }
		set { description=value; } 
} 

ブラウザでの動作確認

IE8の開発者ツール

IE8には、開発者ツールというものがあります。
HTMLの構造をツリー形式で確認したり、HTMLに摘要されているスタイルやレイアウトを動的に変えて見栄えを確認したり、JavaScriptのパフォーマンスを測定したりすることが。IE上でできます。
このようなツールは以前から存在していたようなのですが、IEに標準で存在していることは初めて知りました。
これは大変便利ですね。

HTTP通信の内容もキャプチャできれば、もっと便利なのですが・・・

【Webページのトラブル原因究明にIE8の「開発者ツール」を活用する】
http://www.atmarkit.co.jp/fwin2k/win2ktips/1181ie8dvt/ie8dvt.html

ASP.NET4

参考:ASP.NET 4/ASP.NET MVC/Dynamic Dataの新機能
ASP.NET4の新機能の具体例が示されている。
URLルーティング、クライアントIDの静的な設定、HTMLエンコードをより簡易的に実施できる方法が、具体的なコード例と共に紹介されている。

GridViewで簡単に入力と検証を行う方法
http://blogonos.wordpress.com/category/asp-net-%E5%82%99%E5%BF%98%E9%8C%B2/

ASP.NETでボタンの2度押しを防止する方法

ASP.NETでは、ボタンの2度押しによって本来は1回だけ行いたい処理が、複数回サーバーで実行されてしまう問題が知られています。
ショッピングサイトで、購入ボタンを複数回クリックするなど、本来1回しか行われない処理が複数回実行されてしまう場合があります。

これを簡易的に回避する方法があります。

ボタンコントロールのOnClientClickプロパティに、以下のようにJavaScriptコードを設定します。

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" OnClientClick="if(window.document.readyState != null && window.document.readyState != 'complete'){this.disabled=true;}else{return true;}" />

これにより、2回目以降のボタンクリックでは、ポストバックが発生しないようになります。

この方法では、ボタン一つ一つに対してOnClientClickプロパティの設定が必要になりますが、画面上の全てのボタンで2度押しを防止させたい場合には、下記ページのコードが参考になります。
http://d.hatena.ne.jp/itaosan/20061225/1167025092

最後に・・・ここで紹介した方法は、クライアント側での簡易的な回避方法にすぎません。
JavaScriptをOFFにされた場合や、直接HTTP通信を送り込まれた場合などの対応には、サーバー側での本格的な対策が必要です。

ASP.NETの単体テスト

Webアプリケーションの単体テストを実行する方法

ASP.NETに依存するオブジェクト(Serverオブジェクト、Sessionオブジェクトなど)を使ったメソッドの単体テストを行うための方法についてまとめられています。
http://codezine.jp/article/detail/6209?p=4

単体テストでHttpContextとMembershipオブジェクトを利用する

単体テスト用のHttpContextの構築法や、単体テストでフォーム認証によって認証されたログイン後のユーザーを取得する方法についてまとめられています。
http://devadjust.exblog.jp/12341826/

ASP.NETの自習書

ASP.NET関連の自習書が、マイクロソフトのサイトで無料で入手できます。
http://www.microsoft.com/japan/msdn/vstudio/2008/tech/do-it-yourself.aspx

認証・セキュリティ

ASP.NET Webアプリケーション構成のセキュリティに関するポイント

web.configの設定方法、メンバーシップの取り扱いについての記載もある。
http://msdn.microsoft.com/ja-jp/magazine/gg309184.aspx

複数のWebアプリケーションで認証情報を使いまわす方法

ASP.NETで、複数のWebアプリケーションで認証情報を使いまわす方法が書いてあるサイト。
http://msdn.microsoft.com/ja-jp/library/eb0zx8fc(v=VS.100).aspx
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12120&forum=7

web.configに記述を追加するだけで、対応できるとのこと。

「URL承認に失敗しました」がイベントログに残った場合の対応

このメッセージは、web.configで、ユーザーやロールの制御により、アクセスが拒否されたときに発生する。
web.configの設定を見直す、DBのロールやユーザに関するデータに不備がないか確認する。(ロールの権限を持たないユーザーがアクセスした、など)

また、IISの設定で、フォーム認証を有効にしているかを確認すること

GridView

GridViewで、表の枠線(罫線)を非表示にする方法

GridViewで表の枠線(罫線)を非表示にするには、GridViewのプロパティで、以下の設定をすると解決できる。
GridViewのプロパティで、以下の設定をすると解決できる。
・CellSpacing=-1
・GridLines="none"
参考:http://blog.livedoor.jp/whatson/archives/2009995.html


GridViewなどで、ソートやページングを効率よく実装する方法

こちらのページが参考になります。

IISExpress

IIS Expressで、他のマシンからもアクセスできるようにする

IIS Expressで、他のマシンからもアクセスできるよう、リモートアクセスの設定をしたい場合についてです。
デフォルトでは他のマシンからのリモートアクセスは許可されていませんが、IISExpressの設定ファイルを書き換えることで、実現できます。

■手順1:applicationhost.configを探す
applicationhost.configは、IIS Expressの設定ファイルの一つであり、これを書き換えます。
このファイルは、次の場所にあります。

Visual Studio 2013以前:
c:\ユーザー\(ユーザー名)\ドキュメント\IISExpress\config

Visual Studio 2015以降:
ソリューションフォルダ内の.vsという名前のフォルダ
※隠しフォルダの設定になっています。

■手順2:設定ファイルの書き換え、その他作業
これ以降の詳しい手順は、下記サイトを参照してください。詳しく説明されています。
http://www.ipentec.com/document/document.aspx?page=windows-iis-express-accept-outer-host-access
http://architect-wat.hatenablog.jp/entry/20130513/1368425906
http://nakaji.hatenablog.com/entry/2014/09/19/022536

■手順3:上記手順でうまくいかない場合
この手順により、localhostのドメインでアクセスができなくなる場合もあります。その場合は、localhostのURLにも、ACLの設定を追加します。

netsh http add urlacl url=http://localhost:[ポート番号]/ user=everyone

WebフォームでJSON出力

下記サイトが参考になります。
http://qiita.com/rbtnn/items/b2ec6c7dee792e66ac75

ASP.NETでGlobalクラスを読み込めない場合の対処法

ASP.NETで、下記のエラーメッセージが出たときの対処法です。

パーサー エラー
説明: この要求の処理に必要なリソースの解析中にエラーが発生しました。以下の解析エラーの詳細を確認し、ソース ファイルに変更を加えてください。
パーサー エラー メッセージ: 型 'Global' を読み込めませんでした。
ソース ファイル: /global.asax 行: 1

調べたところ、エラーの原因は、binフォルダにDLLファイルを配置していないことによるものでした。

例えばVisualStudioでソリューションのクリーンをした直後に物理ファイルを配置してしまった場合や、binフォルダを丸ごと更新し忘れた場合などが、原因として考えられるでしょう。

localhostのSSL証明書の有効期限が切れたときの対処法

PowerShellを管理者として起動。 そして以下のコマンドを実行する。
以下の例では、有効期限を5年間に設定している。

New-SelfSignedCertificate -FriendlyName "localhost" -DnsName "localhost" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(5)

次に、コマンドプロンプトを管理者として軌道。そして以下のコマンドを実行する。
(ポート番号は、適切に変更すること)

IisExpressAdminCmd.exe setupsslUrl -url:https://localhost:44345/ -UseSelfSigned

上記2つを行った後で、asp.netのデバッグ実行をして、SSL証明書でエラーが出ていないことを確認する。