[[Open棟梁>https://github.com/OpenTouryoProject]] wiki -[[戻る>アプリケーション設計のポイント]] *目次 [#tecd7392] #contents *概要 [#pda0c156] リダイレクトによる画面遷移、トランスファー(フォワード)による画面遷移から方式を選択する 。 >ココでの画面遷移とは、サーバ上で強制的に次画面に遷移する場合の処理を指している。クライアントが、画面上のリンクなどを押下して遷移する画面遷移ではないので注意する。 -”Open棟梁”は、リダイレクトによる画面遷移、トランスファー(フォワード)による画面遷移の双方に対応している。 --「画面遷移の定義方法」については”Open棟梁”の利用ガイド(開発取り纏め者編)の5.1.3項:「画面遷移処理を実装する」を参照のこと。~ https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/2_User_Guide(Leaders).doc --「画面遷移制御機能」については”Open棟梁”の利用ガイド(各機能編)の4章:「画面遷移制御機能」を参照のこと。~ https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/6_User_Guide(Each_Function_Editing).doc *ASP.NET WebForms [#yebf433b] **リダイレクト [#f0cdb563] +画面遷移は、「Response.Redirect」を使用する。「Server.Transfer」は使用しない。 +画面跨りで使用するデータはSessionに格納する(「[[共通情報の持ち回り方式]]・[[画面間の情報持ち回り方式>#p68fc0ab]]」を参照)。 ※ 次項で説明する「Server.Transfer : トランスファー(フォワード)」は性能的に有利であるが、画面とURL・ASP.NETパイプライン処理が1対1に対応しない。 #ref(Response.Redirect.png,left,nowrap,リダイレクト) **トランスファー(フォワード) [#wcab3dcc] +画面遷移は、「Server.Transfer」を使用する。「Response.Redirect」は使用しない。 +画面跨りで使用するデータはHTTPContextに格納する(「[[共通情報の持ち回り方式]]・[[画面間の情報持ち回り方式>#p68fc0ab]]」を参照)。 #ref(Server.Transfer.png,left,nowrap,トランスファー(フォワード)) *ASP.NET MVC [#h94046c2] ASP.NET MVCは”ユルイ”フレームワークであるのでなんでもできてしまう。 従って、何か規則を決めないと、議論できないので、 >URL - 画面 - MVCコンポーネントのセットが1対1に対応させたとする。 この場合、 ≒ ASP.NET WebFormsの設計が可能である。 MVCには、 -Html.BeginForm -Ajax.BeginForm の2つの方式があるので、これについて議論する。 **Html.BeginForm [#of29c1a3] -基本的に自コントローラにPost( ≒ Postバック)して、画面全体(View)を再描画する。 // 結果表示するメッセージ string message = ""; CrudModel model = new CrudModel(); // 値の復元のため、CopyInputValuesを呼び出す。 model.CopyInputValues(form); // メッセージを設定。 model.Message = message; // Html.BeginFormでは、全体更新。 return View("Index", model); -画面遷移の際は、他コントローラにリダイレクトする方式を採る。 //return new RedirectResult("/CrudMu/"); return Redirect("/CrudMu/"); **Ajax.BeginForm [#rb21b4d6] -基本的に自コントローラにFrom情報をAjaxで送信して、画面の一部(PartialView)をAjaxで返信して描画する。 // 結果表示するメッセージ string message = ""; CrudModel model = new CrudModel(); // メッセージを設定。 model.Message = message; // Ajax.BeginFormでは、以下のように記述することで部分更新が可能。 return PartialView("_MessageView", model); -予定外の部位を部分更新する場合はJavaScriptを使用する必要がある。 // Ajax.BeginFormでは、UpdateTargetIdで指定した // ターゲット以外を更新する場合、JavaScriptでの対応が必要。 // #ここではjQueryを使用している。 string scriptText = "$('#lblMessage').text('" + message + "');"; return JavaScript(scriptText); -画面遷移の際は、他コントローラにリダイレクトする方式を採るが、この処理は、JavaScriptで実装する必要がある。 return JavaScript("location.href='/CrudMu2/';"); *画面間の情報持ち回り方式 [#p68fc0ab] -参考:[[ASP.NETの状態管理方式>http://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%E3%81%AE%E7%8A%B6%E6%85%8B%E7%AE%A1%E7%90%86%E6%96%B9%E5%BC%8F]] **リダイレクト時の情報の持ち回り [#ka8735a5] 画面遷移方式に「リダイレクト」を採用した場合の情報の持ち回り・状態管理方式テンプレート ***Session [#c4c4f088] -使用者~ 基盤, 業務で使用可能。 -使用方法 --画面遷移の際に、次画面に引き渡すために使用する。 --画面間複数の画面に渡って保持する情報のみ保持する。 --セッションの明示的な破棄、明示的なセッション タイムウトまで、~ メモリ上のオブジェクトが破棄されないので注意して利用する。 ***Form (Hidden)、HttpContext [#u39dd4a8] -使用者 --基盤, 業務で使用可能。 --ASP.NET MVCは、Formの分割が可能であるため、基盤利用が困難。 -使用方法 --PostBackのうちは、情報引継ぎが可能。 --リダイレクトでの画面遷移の間では情報を引き継げない。 --エラー画面遷移など特殊な画面遷移でのみ利用する。 ***ViewState [#h701e1ea] -使用者 --基盤で使用される。 --業務でも使用可能。 -使用方法 --ASP.NET WebFormsの基盤で自動的に使用される。 --ASP.NET MVCでは使用できないので注意する。 --Hiddenで実装されるため、使用方法は上記Hiddenと変わらない。 --Base64エンコーディングが施されるが、暗号化はされない。 --EnableViewStateMacプロパティを使用して、改ざん検知などをすることが可能。 ***QueryString [#y15a1f43] -使用者~ 基盤, 業務で使用可能。 -使用方法 --URLの後ろに不可するパラメタを使用して情報を受け渡す方式。 --Getによる画面遷移、Get・Postの両画面遷移に対応する場合に使用する。 --使用する際はセキュリティ的に問題が無いか注意する。 ***Cookie [#geaf6960] -使用者~ 基盤で使用。 -使用方法 --SessionIDやForms認証の認証チケットなどで使用される。 --基盤類の挙動をコントロールするときなどに使用することが多い。 --業務(ユーザ・プログラム)で頻繁に書き換える情報ではなく、~ 基盤で使用するシステム共通引き継ぎ情報を持ち回るために使用する。 -注意事項 --使用する際はセキュリティ的に問題が無いか注意する。 --携帯端末ではサポートされない機種があるので注意する。 ***Application、静的変数 [#h22ed553] -使用者~ 基盤で使用。 -使用方法~ システム全体で使用する情報を保存する。 -注意事項 ---障害を引き起こす事があるのでユーザ プログラム側では使用しない方が良い。 ---メモリリーク(タイムアウトが存在しない) ---スレッド競合(スレッドセーフではない)などによる結果不正。 ***TLS(Thread Local Storage) [#c21e598a] -使用者~ 基盤で使用。 -使用方法~ 当該スレット(≒リクエスト)で使用する情報を保存する。 -注意事項~ データの持ち回りを隠蔽(自動化)できるが、引数・戻り値の方が無難。 --初期化処理の実装 --2層から3層化した時のデータの持ち回り ***Cache(System.Net.Cache) [#le286ccf] -使用者~ 基盤で使用。 -使用方法~ キャッシュする。 -注意事項~ 利用が難しい。 **トランスファー(フォワード)時の情報の持ち回り [#ndc0f153] 画面遷移方式に「トランスファー(フォワード)」を採用した場合の情報の持ち回り・状態管理方式テンプレート ***Session [#pfbb5250] リダイレクトと同じ。 ***Form (Hidden)、HttpContext [#k8aad0f1] リダイレクトと異なる点。 -トランスファー(フォワード)では画面遷移の間では情報を引き継げる。 -1回のリクエスト ~ レスポンスで破棄されるため、問題を起こし難い。 -トランスファー(フォワード)で、Form (Hidden) ---> HttpContextと繋ぐと、~ SessionステートレスなWebアプリケーションを開発することができる。 ***ViewState [#uc25aa82] リダイレクトと同じ。 ***QueryString [#y15a1f43] リダイレクトと同じ。 ***Cookie [#geaf6960] リダイレクトと同じ。 ***Application、静的変数 [#h22ed553] リダイレクトと同じ。 ***TLS(Thread Local Storage) [#c21e598a] リダイレクトと同じ。 ***Cache(System.Net.Cache) [#le286ccf] リダイレクトと同じ。 **TLS(Thread Local Storage) [#v81d8b7f] TLS(Thread Local Storage)については以下を参照。 -MSDNライブラリ --.NET開発 > スレッド ローカル ストレージ : スレッド相対静的フィールドとデータ スロット~ http://msdn.microsoft.com/ja-jp/library/6sby1byh.aspx --System.ThreadstaticAttributeクラス~ http://msdn.microsoft.com/ja-jp/library/system.threadstaticattribute.aspx --System.Threading.Thread.AllocateDataSlotメソッド~ http://msdn.microsoft.com/ja-jp/library/system.threading.thread.allocatedataslot.aspx --System.Threading.Thread.AllocateNamedDataSlotメソッド~ http://msdn.microsoft.com/ja-jp/library/system.threading.thread.allocatenameddataslot.aspx -Web/DBプログラミング徹底解説 > スレッドローカルストレージ (TLS) を理解する~ http://keicode.com/windows/win19.php