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証明書でエラーが出ていないことを確認する。
localhostでのデバッグ実行でSSLのエラー対応
Windowsマシンを再起動すると、SSL証明書が正しく認証される。
それでもダメな場合は、下記の方法でウェブアクセスは可能になるが、証明書エラーは表示され続ける。
https://qiita.com/TK-C/items/13efa5a45beb6de29134
|