- PR -

[ASP.NET]WebFormの状態を再現したい

投稿者投稿内容
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-04-26 11:53
画面入力情報の保存・復元のためにViewStateをまるごとSessionに保持って考え方があるんですね

あ、でもこのスレだけだと具体的な実装方法まで導き出せてないのか
一意な簡単なコードで実現できれば便利そうですけどね…

私がよく使う地味〜な方法ですが、必要なものだけidをキーにHashTableに格納してSessionに保持するようにしています。
POKKURI
会議室デビュー日: 2003/10/27
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2005-04-26 17:37
回答ありがとうございます。

>私がよく使う地味〜な方法ですが、必要なものだけidをキーにHashTableに格納してSession
>に保持するようにしています。

junya_s0さんの要件と同様で、1つ1つの値を保持するのはかなり面倒なんで避けたいと思っています。

調査中ですが、私のやりたい内容が以下のサイトで実現されているようです。
英語力のない私には難解ですが・・・(TдT)

http://www.codeproject.com/aspnet/PersistentStatePage.asp
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-04-26 19:47
引用:

junya_s0さんの要件と同様で、1つ1つの値を保持するのはかなり面倒なんで避けたいと思っています。


Saveの時はControlコレクションをループで回してTypeを見ながらHashTableにidをキーに格納。テキストボックスならText、チェックボックスならChecked、ドロップダウンならSelectedIndex、みたいに保持するプロパティを決めておく。

Loadの時はHashTableの方をループで回してキー(id)からFindControlして、見つかったControlのTypeから復元するプロパティを判断して値をセット

みたいにすれば1つ1つの処理を自分で書く必要は無いと思いますけど…

実際動かして試したわけではないので本当にこの方法がうまく動くかはわかんないです。私は1つ1つやってたので。

引用:

調査中ですが、私のやりたい内容が以下のサイトで実現されているようです。
英語力のない私には難解ですが・・・(TдT)

http://www.codeproject.com/aspnet/PersistentStatePage.asp



もし解読できたら、結果をフィードバックして頂けると私を含めた英語力の無い人々が喜ぶかも
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-04-26 23:08
引用:

画面入力情報の保存・復元のためにViewStateをまるごとSessionに保持って考え方があるんですね


 できる/できないとは別の次元で、考えはある、ということで。自前でviewStateを展開できれば可能でしょうが、まぁ、やらない方がいいでしょう。

 私は[投稿日時: 2003-12-02 17:49]どおり、必要なものをシリアル化してセッションに放り込みました。
 シリアル化と書くと難しそうですが、要は画面上の設定をまとめたクラスを作り、それを保存した、ということです。
 一つ一つが面倒?クラス内の値を画面上に出すのはバインド使えばいいんですけどね。ポストされた値をバインド元にフィードバックする方法は、実は私も知りません(^o^;

_________________
POKKURI
会議室デビュー日: 2003/10/27
投稿数: 4
お住まい・勤務地: 大阪
投稿日時: 2005-04-27 13:38
ほのぼのさん、Jittaさん ご回答ありがとうございます。

>Saveの時はControlコレクションをループで回してTypeを見ながらHashTableにidをキーに格
>納。テキストボックスならText、チェックボックスならChecked、ドロップダウンなら>SelectedIndex、みたいに保持するプロパティを決めておく。
>Loadの時はHashTableの方をループで回してキー(id)からFindControlして、見つかった>ControlのTypeから復元するプロパティを判断して値をセット

VIEWSTATEを保持するよりも上記の方法が1番軽く良いと思われるのですが、値以外のプロパティを保存できなかったり、データグリッドのVIEWSTATEを保存できないので制限はあるとおもいます。もちろん設計でカバーすればよい話なのですが・・・。

>私は[投稿日時: 2003-12-02 17:49]どおり、必要なものをシリアル化してセッションに放
>り込みました。
> シリアル化と書くと難しそうですが、要は画面上の設定をまとめたクラスを作り、それを保
>存した、ということです。

ありがとうございます。[投稿日時: 2003-12-02 17:49]の内容はそういうことだったのですね。
理解できました。

前回あげていた、
http://www.codeproject.com/aspnet/PersistentStatePage.asp
のサイトで示されているサンプルソースを使用すると、VIEWSTATEの保存ができました。
しかしこの方法は ポストバックをエミュレートしてデータを復元するという感じで少々強引な感じもします・・・
私のスキルではこの手法の評価が難しいのでどなたか評価していただければありがたいです。

上記サイトでは以下のような方法で、画面の状態を引き継いでいるみたいです。
詳しく知りたい方は上記のサイトからソースを手に入れてください。

PageクラスのSavePageStateFromPersistenceMedium メソッドをオーバーライドして
viewStateとRequest.FormをPageState(シリアル化可能な独自の状態管理クラス)オブジェクトにセットする。
PageStateオブジェクトはセッションにセットする。

PageクラスのLoadPageStateFromPersistenceMedium() メソッドをオーバーライドして
セッションに保持していたPageStateオブジェクトを取得する。
そしてPageStateオブジェクトの中のviewStateを取得して 戻り値に指定する。

PageクラスのDeterminePostBackMode() メソッドをオーバーライドして
セッションにviewStateが保持されている場合は Request.Formを戻り値に指定する。

※このメソッドがnull以外を戻すと、Redirectで遷移してきた場合でもPostBackと認識され
LoadPageStateFromPersistenceMediumメソッドが呼び出される。

PageクラスのOnLoad メソッドをオーバーライドして
LoadPageStateFromPersistenceMediumメソッドからPageStateオブジェクトが取得できていた場合
はPageStateオブジェクトの中のPostData(Request.Form)を取得してPageに含まれるすべてのコントロールのLoadPostDataを呼び出して
値を復元する。


例 PageA → PageB → PageA の遷移でPageAの状態を保存し、復元する。

@PageAにポストバック

APageAのDeterminePostBackModeが呼び出される。
※通常のPostBack

BPageAのLoadPageStateFromPersistenceMediumが呼び出される。
※通常の動作

CPageAのSavePageStateFromPersistenceMediumが呼び出される。
※ここでviewStateとRequest.Formを保持しPageBにリダイレクト

・・・PageBの動作省略

DPageBのどこかでPageAにリダイレクト

EPageAのDeterminePostBackModeが呼び出される。
※ここで通常は nullが返却されるが
PostBackをエミュレートする為に Request.Formを返却する。

FPageAのLoadPageStateFromPersistenceMediumが呼び出される。
※セッションからviewStateを取得し戻り値に指定

GPageAのOnLoadが呼び出される。
※セッションから前回のRequest.Formを取得し、
含まれるすべてのコントロールのLoadPostDataを呼び出して値を復元する。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-04-27 14:20
引用:

POKKURIさんの書き込み (2005-04-27 13:38) より:
VIEWSTATEを保持するよりも上記の方法が1番軽く良いと思われるのですが、値以外のプロパティを保存できなかったり、データグリッドのVIEWSTATEを保存できないので制限はあるとおもいます。もちろん設計でカバーすればよい話なのですが・・・。


HashTableはObject型で格納できるので、例えばControlクラスのインスタンスをまるごと放り込んだらどうなるんだろう、とか、値以外のプロパティも保持できるクラスを自前で作って、そのインスタンスをHashTableに格納するとか、応用の余地はけっこうあると思いますよ

今本職の方でちょっと忙しくて、自分で試す時間が無いのが残念ですが…

引用:

私のスキルではこの手法の評価が難しいのでどなたか評価していただければありがたいです。


上記理由により、今すぐは無理… orz
誰か他の方に…(逃)

スキルアップ/キャリアアップ(JOB@IT)