チェックボックスリストや検索結果を保持する2つのコンテナなど、いくつかのコントロールを備えたページがあります。
このサイトを永続化するように言われたので、ユーザーはサイトを閲覧しているときにどこからでも戻って、設定が復元されていることを確認できます(読み取り:チェックボックスがオンになっています。結果は引き続き利用可能です)
これまで、SavePageStateToPersistenceMediumとLoadPageStateFromPersitenceMediumをオーバーライドしようとしましたが、ページのボタンをクリックするとすぐに、常に黄色の死の画面が表示されます。
protected override void SavePageStateToPersistenceMedium(object viewState)
{
string str = "VIEWSTATE_" + Request.UserHostAddress;
Cache.Add(str, viewState, null, DateTime.Now.AddMinutes(Session.Timeout), TimeSpan.Zero, CacheItemPriority.Default, null);
ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", str);
ClientScript.RegisterHiddenField("__VIEWSTATE", "");
}
protected override object LoadPageStateFromPersistenceMedium()
{
string str = Request.Form["__VIEWSTATE_KEY"];
if (!str.StartsWith("VIEWSTATE_"))
{
throw new Exception("Invalid viewstate key:" + str);
}
return Cache[str];
}
コードに何か問題がありますか?Page_LoadまたはPage_initでビューステートを取得するために何を呼び出す必要がありますか?
編集:これはsession["xyz"]を介してそれを解決するためのアプローチです
List<ListItem> selectItems = new List<ListItem>();
foreach (ListItem item in CheckBoxListLevel.Items)
{
if (item.Selected)
selectItems.Add(item);
}
Session.Add("SavedLevelItems", selectItems);
//そしてPage_Loadで
if (Session["SavedLevelItems"] != null)
{
List<ListItem> SessionList = (List<ListItem>)Session["SavedLevelItems"];
foreach (var item in SessionList)
{
if (item.Selected)
{
CheckBoxListLevel.Items.FindByText(item.Text).Selected = item.Selected;
}
}
}
ただし、検索結果を表示してからGETを実行して最初のページに戻ると、保存されているすべてのアイテムが正しくレンダリングされません。