0

私はクラスとOOPにまったく慣れていないので、ご容赦ください。

私は自分のクラスを作成して整頓しようとしている大規模な Web アプリを作成しています。

たとえば、Public Class Productいくつかのプロパティを持つ があります。私が使用している 1 つの方法は、ページの読み込み時に製品 ID が ID プロパティに割り当てられ、ID プロパティがその製品の詳細を取得し、さまざまなデータを他のプロパティに割り当てることです。したがって、コード内で、たとえば product.price または product.description を使用して、適切な値を取得できます。これはうまくいきましたが、ページの読み込み時にクラスが開始されたため、ページが更新されるたびに DB からデータを取得していたことがわかりました。If Not IsPostbackを使用してクラスを開始することでこれを止めました。これは、最初のページ読み込み時にのみデータが取り込まれたことを意味します。ここまでは順調ですね。

次に、テキスト ボックスの値を製品のプロパティと比較する必要がありました。textchanged イベントがあります

If textbox1.Text <> product.description Then....

しかし、ここでは波線が下にproduct.descriptionあり、VS2010 はオブジェクトが定義されていないと言っています。page.load で Dim されたので、Dim ステートメントをページ クラスの外に移動して、ページ上のすべてのイベントにアクセスできるようにしました。

薄暗い声明はDim product as New product

私のnot ispostbackコードチャンクでは、たとえばproduct.ID = 1、製品1のすべての製品プロパティを取得します

波線はなくなりましたが、ページを実行すると、ページの読み込み時にすべて正常に動作します。データが表示されるので、製品クラスは正常に動作しています。textbox1 に変更を加えるとすぐに、イベントトリガーproduct.descriptionは何もありません。再起動しました。

どうすればこれを止められるでしょうか...

4

3 に答える 3

1

「製品」はポストバック間で保持されません。

aspx ページのコントロール オブジェクトのみが自動的に永続化/復元されます。

これを改善するには、複数のアプローチがあります。

「Product.id = 1」を設定して製品がロードされた場合、prerender イベント中に product.id の値を受け取る隠しフィールドを作成し (ページに保存するため)、init イベントで復元します。 「Product.id=hiddenfield.value」ですが、オブジェクトをリロードするポストバックの場合のみです。

編集

私の答えを選んでくれてありがとう。これに対処するためのさまざまな方法と、なぜ私の答えを提案したのかについて少し詳しく説明します。

キーを HiddenField に格納 DB からリロード:

長所: 製品は常に新鮮/正確/最新の値です。データベースに対応。データベースは、主キーに基づいてレコードを返すのに非常に効率的です。クライアント ブラウザとの間で送受信されるデータはほとんどありません。低複雑性。クライアントが開いた各ページは安全に分離されます。

短所: 複数のデータベース トランザクション。DB がすでに負担がかかっているか、非常に大規模である場合は、最小の効率向上を考慮する必要があるかもしれませんが、これは一般的ではないか、主キー ベースのレコードではありそうにありません。

セッション状態 (オブジェクト全体を保存) :

長所:オブジェクトは一度ロードされるとメモリ内で利用できるため、オブジェクトを「ロード」するまでの時間が最も短くなります。DB トランザクションが少ない。クライアントにピギーバックされ、再び戻されるデータはありません。

短所: DB で変更された場合、オブジェクトが「古くなっている」可能性があります。アプリケーションの複数のページを開くユーザーは、両方が異なる「製品」を必要とする場合、間違ったオブジェクトを取得する可能性があります。そのため、完全に安全であるためには、複数の製品を保存するか、いくつかの製品に基づいて保存するためのより複雑な構造が必要です。キーの種類 (製品 ID など)。サーバー メモリが使用されます。何千人ものユーザーにサービスを提供する場合、または製品データが大きい場合、特に多くのオブジェクトを含む多くのページでこれを行う場合、問題になる可能性があります。

シリアル化 (イベント状態と同様に、ページ内のオブジェクト全体をフィールドに格納します) :

長所: ロードされると、データベースは特定の製品に対して 1 回だけアクセスされます。その後、製品は完全にページ内に保持され、フィールド内のデータから、またはビューステートを介してサーバーによって再作成されます。クライアントが開いた各ページは安全に分離されます。Page の ViewState への格納を実装するのはかなり簡単です。

短所: DB で変更された場合、オブジェクトが「古くなっている」可能性があります。ページの応答とユーザーの次のページの要求に ALLOT のデータが追加されます。正しくシリアル化されるようにオブジェクトを設計する必要があるため、実装がより複雑になります。複雑なオブジェクトを正常にシリアル化するには、手動コードの割り当てが必要です。

繰り返しますが、これに対処する方法は他にもたくさんあります。たとえば、アイテムをアプリケーションに対してグローバルに同期化された辞書スタイル オブジェクトに格納するなどです。

于 2013-05-09T19:08:21.803 に答える
1

これは、標準のASP.NET ページ ライフ サイクルの問題である可能性があります。

ページを初期化すると、ユーザーのブラウザに送信されます。ユーザーが何かをクリックすると、ブラウザーはポストバック要求をアプリケーションに送り返します。ビュー ステートにより、textbox1 オブジェクトは Text プロパティの内容を記憶できます。ただし、Page_Load はゼロから実行され、製品オブジェクトを含むすべてがゼロから再作成されました。

ポストバックの前に知っていたことを製品オブジェクトに「記憶」させたい場合は、それを思い出させる必要があります。1 つの方法は、初期化された値をSession stateに保存し、Page_Load メソッドのポストバック セクションで製品オブジェクトを更新することです。

于 2013-05-09T19:19:10.647 に答える