ASP.net ViewState-無効になっている場合でも、いくつかのビューステートが存在します。どうして?
質問
ページ上でEnableViewStateプロパティが無効になっている場合でも、ページ上にいくつかのビューステートがまだ表示されています:
"<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="VkBAB3n5LZYtY+nTzk1vEu1P/6QLf4qzFIKzpFRJe3DMf8UseUA/1RsO409HJX4QhkROSP0umoJvatjK/q+jXA==" />"
私の質問はなぜですか?
解決
これは、ControlStateを使用しているコントロールである可能性があります。コントロール状態を持つコントロールは、ViewState設定を無視します。
他のヒント
これは制御状態です。
ビューステートとコントロールステートを本当に削除したい場合、このコードをページの分離コードで使用するか、分離コードが派生するクラスで使用できます
class MyPage : Page {
private class DummyPageStatePersister : PageStatePersister {
public DummyPageStatePersister(Page p) : base(p) {}
public override void Load() {}
public override void Save() {}
}
private DummyPageStatePersister _PageStatePersister;
protected override PageStatePersister PageStatePersister {
get {
if (_PageStatePersister == null)
_PageStatePersister = new DummyPageStatePersister(this);
return _PageStatePersister;
}
}
// other stuff comes here
}
ただし、これを行うときは、コントロールとの契約に違反しているため、非常に注意してください。 MSDNでは、制御状態は常に利用可能であると明示的に述べています。しかし実際には、私にとってはうまくいきました。
編集: 私は下票を投じられたので、もう一度指摘したいのです。あなたが何をしているかを正確に知っていない限り、これをしないでください。私の場合、アプリケーション全体のほとんどがクライアント側のJavaScriptで記述されており、ポストバックが発生したいくつかの場所では、常にRequest.Formコレクションを使用して値を取得していました。 これを行う場合は、単純なレンダリング以外にはサーバー側のコントロールを使用しないでください。
この記事は少し古いですが、私の理解では、ほとんどのポイントはまだ有効です:
- ViewStateを使用する場合は、ASPXページにサーバー側のフォームタグ()が必要です。 ViewState情報を含む非表示フィールドがサーバーにポストバックできるように、フォームフィールドが必要です。また、ASP.NETページフレームワークは、ページがサーバーで実行されるときに非表示フィールドを追加できるように、サーバー側のフォームである必要があります。
- ページ自体は、約20バイトの情報をViewStateに保存します。これは、ポストバック時にPostBackデータとViewState値を正しいコントロールに配布するために使用します。そのため、ページまたはアプリケーションでViewStateが無効になっている場合でも、ViewStateに残りの数バイトが表示される場合があります。
- ページがポストバックしない場合、サーバー側タグを省略することでページからViewStateを削除できます。
これはに関する非常に素晴らしい記事です。 ASP.NETで開発する場合はViewState をお読みください!
ASP.NET ViewState Helper は、進行状況を確認するための優れたツールでもあります。 ViewStateでオン
Controlstateが原因である可能性があります。制御状態を無効にすることはできません。 ASP.NET 2.0では、制御を機能させるために必要なデータ(controlstate)と、その他のデータ(viewstate)が区別されます
そして、はい、いくつかのコントロールはcontrolstateなしでは動作しません。 どれが原因であるか、またはビューステートに何が含まれているかを知りたい場合は、 viewstate viewerをチェックしてください。
テキストボックス、チェックボックスなどのような IPostBackEventHandler を実装するコントロール。ビューステートを無効にしても状態を保持します。その理由は、ポストバックデータの読み込み段階で、これらのコントロールがポストバックフォームから状態情報を取得するためです。
ただし、 IPostBackEventHandler を実装しない label のようなコントロールは、ポストバックされたデータから状態情報を取得しないため、状態を維持するためにビューステートに完全に依存します。