価値があるのは、私が手にした大きな画像の問題を解決するために使い終わったコードです:htmlからviewstateを動かす。ちょうどあなたのmypage.aspx.csにこれをポップ:
// Inspired by: http://aspalliance.com/72
const string ViewStateFieldName = "__VIEWSTATEKEY";
const string RecentViewStateQueue = "RecentViewStateQueue";
const int RecentViewStateQueueMaxLength = 5;
protected override object LoadPageStateFromPersistenceMedium()
{
// The cache key for this viewstate is stored where the viewstate normally is, so grab it
string viewStateKey = Request.Form[ViewStateFieldName] as string;
if (viewStateKey == null) return null;
// Grab the viewstate data from the cache using the key to look it up
string viewStateData = Cache[viewStateKey] as string;
if (viewStateData == null) return null;
// Deserialise it
return new LosFormatter().Deserialize(viewStateData);
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
// Serialise the viewstate information
StringBuilder _viewState = new StringBuilder();
StringWriter _writer = new StringWriter(_viewState);
new LosFormatter().Serialize(_writer, viewState);
// Give this viewstate a random key
string viewStateKey = Guid.NewGuid().ToString();
// Store the viewstate in the cache
Cache.Add(viewStateKey, _viewState.ToString(), null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(Session.Timeout), CacheItemPriority.Normal, null);
// Store the viewstate's cache key in the viewstate hidden field, so on postback we can grab it from the cache
ClientScript.RegisterHiddenField(ViewStateFieldName, viewStateKey);
// Some tidying up: keep track of the X most recent viewstates for this user, and remove old ones
var recent = Session[RecentViewStateQueue] as Queue<string>;
if (recent == null) Session[RecentViewStateQueue] = recent = new Queue<string>();
recent.Enqueue(viewStateKey); // Add this new one so it'll get removed later
while (recent.Count > RecentViewStateQueueMaxLength) // If we've got lots in the queue, remove the old ones
Cache.Remove(recent.Dequeue());
}
そしてSessionPageStatePersisterを使用しての超簡単な方法のために、もう一度mypage.aspx.csでこれを置く:
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}
あなたが考えられていますセッションの代わりにDBにViewStateを格納すると、これは簡単になり、はるかに優れているはずです – Daveo
RPM:viewstateはすでにシリアル化されているため、違いはありません。私のサーバー上のRAMは、オーストラリアのネットワーク接続で両方の方法で100kbのviewstateを送信するよりもずっと高速です。 – Chris
daveo:DbはRAMよりも遅いでしょう。スケーリングは問題ではありません。そのようなウェブサイトではありません。 – Chris