開発環境:Windows2000Professional VisualStudio.net C#
こんにちは。いつもお世話になっています。
Webアプリケーションを作成しています。
Webフォームのコマンドボタンをクリックしたりすると
毎回、Page_Loadメソッドが実行され、publicで定義している
変数が初期化されてしまいます。
2回目以降のロード時には初回ロード時の情報を保持しておくには
どうすればよいのでしょうか?
例)
public class WebForm1 : System.Web.UI.Page
{
// WebServiceを宣言
protected localhost.Service1 service;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// 初回ロード時の場合
if( IsPostBack == false)
{
// サービスを作成する
service = new localhost.Service1();
// サービスをコール
service.test() ;
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
// サービスをコール
service.test1() ; ←このときはserviceはnullになっている
}
よろしくお願いします。
ViewStateに入れておいてはどうでしょう?
ただ、[Serializable]なクラスしか入れられないので、
localhost.Service1というクラスで使用できるかどうかは
わかりません。
akiさんどうもありがとうございました。
localhost.Service1はViewStateに入れることはできませんでした
が、その他に保持しておきたい変数(int)は入れることができました。
現在、localhost.Service1のコンストラクタで
DBに接続しているのですが、
page_loadごとにlocalhost.Service1クラスを初期化している状態です。
こういう作り方は普通なのでしょうか?
何か良い方法があれば教えてください。
よろしくお願いします。
初めまして。ZEBRAと申します。
基本的に、WebFormのインスタンスは、POSTBACK(初回ではなく、2回目以降のロード)
する度に、再作成されます。
、なので、当然、そのWebFormが保持しているプロパティ等の情報は、忘れ(初期化さ
れ)てしまいます。
ところが、毎回、初期化されては不都合が多いので、この情報をどこかに記憶し、
POSTBACK時に復元できるようにする必要が出てきます。
これを実現する実現として、以下の3つの方法があります。
①ViewStateを使う。
クライアントが、隠しフィールドを利用して覚えておく変数。
但し、クライアントからHTTP要求を出す度に、ViewStateの情報
も送信することになるので、ネットワークの負荷が大きいというデメリットがある。
記憶できるのは、シリアライズ可能なオブジェクトのみになる。
②Session変数を使う。
Webサーバがセッション毎に管理している変数。
但し、Webサーバが記憶することになるので、多用するとサーバリソースに
負担がかかるデメリットあり。
ViewState同様、記憶できるのは、シリアライズ可能なオブジェクトのみになる。
③Cacheを使う。
利用したことがないのでわかりません…。ヘルプで確認してください。
>現在、localhost.Service1のコンストラクタで
>DBに接続しているのですが、
>page_loadごとにlocalhost.Service1クラスを初期化している状態です。
>こういう作り方は普通なのでしょうか?
基本的に、POSTBACKする度に作り直すというのがスタンダードな作りのようですね。
>(3)Cacheを使う。
Cookie じゃなくて?
Cookieとは別に、キャッシュというものが存在するようです。
ASP.NETでは、
System.Web.Caching.Cacheクラスが提供しているようです。
ヘルプには、以下のように説明されています。
「ASP.NET には、大量のサーバー リソースをメモリ内に作成するために必要とするオブ
ジェクトを格納できるようにするための強力で使いやすいキャッシュ機構が用意されて
います。」
まだ使ったことがないので、SessionやViewStateとの違いをよくわかっていませんが、
機会があれば、深く調べてみようと思います。