我遇到了自定义控件(从用户控件继承)的问题 - 我的LoadControlState未被触发。LoadControlState未被触发
嗯,确切地说:它被正常触发,但是当我重写页面的LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium函数时,它不再被触发。
是否有任何典型的原因LoadControlState没有被激发,我应该看看?当确实被解雇时,是否有任何先决条件?
感谢
我遇到了自定义控件(从用户控件继承)的问题 - 我的LoadControlState未被触发。LoadControlState未被触发
嗯,确切地说:它被正常触发,但是当我重写页面的LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium函数时,它不再被触发。
是否有任何典型的原因LoadControlState没有被激发,我应该看看?当确实被解雇时,是否有任何先决条件?
感谢
下面的代码固定它:
PageStatePersister pageStatePersister;
protected override PageStatePersister PageStatePersister
{
get
{
// Unlike as exemplified in the MSDN docs, we cannot simply return a new PageStatePersister
// every call to this property, as it causes problems
return pageStatePersister ?? (pageStatePersister = new SessionPageStatePersister(this));
}
}
由于.NET 2.0,则建议把你的状态持续的逻辑从PageStatePersister派生的自定义类。所以你可以尝试采取这种方法。
你从LoadPageStateFromPersistenceMedium
方法实施返回什么?这大概应该是既ViewState中和了ControlState-数据初始化的System.Web.UI.Pair的一个实例:
return new Pair([Restored ControlState], [Restored ViewState]);
对于它的价值,这里就是我如何重写保存/的LoadPageStateFromPersistenceMedium功能。基本上,它存储在用户会话视图状态,使回传速度快:
// Inspired by: http://aspalliance.com/72
const string ViewStateFieldName = "__VIEWSTATEKEY";
const string ViewStateKeyPrefix = "ViewState_";
const string RecentViewStateQueue = "ViewStateQueue";
const int RecentViewStateQueueMaxLength = 5;
protected override object LoadPageStateFromPersistenceMedium()
{
// The cache key for this viewstate is stored in a hidden field, so grab it
string viewStateKey = Request.Form[ViewStateFieldName] as string;
if (viewStateKey == null) return null;
// Grab the viewstate data using the key to look it up
return Session[viewStateKey];
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
// Give this viewstate a random key
string viewStateKey = ViewStateKeyPrefix + Guid.NewGuid().ToString();
// Store the viewstate
Session[viewStateKey] = viewState;
// Store the viewstate's key in a 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
Session.Remove(recent.Dequeue());
}
我也试过了,通过覆盖Page的PageStatePersister属性和返回'新的SessionPageStatePersister(this);' - 这与之前的结果相同。 – Chris 2011-01-10 21:13:19
@Chris,你在自定义控件的OnInit中调用了Page.RegisterRequiresControlState?还有一件事是检查控制ID是否发生变化(或稍后分配)。 – VinayC 2011-01-11 04:26:36