1

別のページを開いてそこでいくつかのポストバックを行うと、あるページで Viewstate 情報が消えるという現在の問題があります。

  1. ListPage を開き、選択したオプションを変更してポストバックを実行します
  2. 新しいタブで AddPage を開くボタンを押す
  3. AddPage で、いくつかのポストバックを実行するいくつかの新しいエントリを追加し、タブを閉じます
  4. ListPage に戻り、グリッドを更新してみてください
  5. ListPage では、viewstate は空です

そのため、ビューステートから値を格納して取得するプロパティがある場合、ステップ 5 でビューステートから null を取得します。

if (ViewState["Stuff"] == null)
    return MyObject.Default;
else
    return (MyObject)ViewState["Stuff"];

私の理解では、ビューステートの履歴サイズはデフォルトで 9 ( <sessionPageState historySize="9" />) ですが、これが異なるページ間で共有されるとは思っていなかったので、この値を変更したくありません。

ページごとに生成された Guid を使用してセッションに保存することで、保存されたプロパティを回避できますが、フォーム コントロールとデータベースから値を取得したものはすべて再設定する必要があります。

ビューステートの履歴をタブ/ウィンドウ間で独立させる方法はありますか? またはそれを回避する方法はありますか?

それが役立つ場合は、各ページで Telerik コントロールを使用しています。

編集:この説明は、ビューステート情報がセッションに正確にどのように保存されているか、およびsessionPageState構成がそれにどのように影響するかを理解するのに役立ちました。

4

1 に答える 1

2

何が起きていたのかを知り、

デフォルトでは、ページは ViewState を Session に格納しています。つまり、System.Web.UI.SessionPageStatePersisterを使用しています。これを知っていれば、観察された動作は正常です。一定量のページ状態 (ポストバック) のみを保存し、同じセッション内にある限り、ポストバックが作成されているタブ/ページに関係なく、ポストバックごとに古い情報が失われます。

これをページに追加して、ViewState をページ自体の隠しフィールドに保存するように指示しました。それはすでに私がそれが起こっていると思っていたことでした。

protected override PageStatePersister PageStatePersister
{
    get
    {
        return new HiddenFieldPageStatePersister(this);
    }
}
于 2013-10-22T08:48:29.300 に答える