C# LoadControlState未被解雇
我的自定义控件(从用户控件继承)有问题-我的LoadControlState没有被触发 确切地说,它通常会被激发,但当我重写页面的LoadPageStateFromPersistenceMedium和savePageStateTorPersistenceMedium函数时,它就不再被激发 LoadControlState没有被炒鱿鱼有什么典型的原因我应该调查一下吗?它什么时候被解雇有什么先决条件吗C# LoadControlState未被解雇,c#,asp.net,user-controls,viewstate,C#,Asp.net,User Controls,Viewstate,我的自定义控件(从用户控件继承)有问题-我的LoadControlState没有被触发 确切地说,它通常会被激发,但当我重写页面的LoadPageStateFromPersistenceMedium和savePageStateTorPersistenceMedium函数时,它就不再被激发 LoadControlState没有被炒鱿鱼有什么典型的原因我应该调查一下吗?它什么时候被解雇有什么先决条件吗 感谢.NET 2.0以来的,建议您将状态持久化逻辑放在从派生的自定义类中。所以你可以试着采取这种方
感谢.NET 2.0以来的,建议您将状态持久化逻辑放在从派生的自定义类中。所以你可以试着采取这种方法 您的
LoadPageStateFromPersistenceMedium
方法实现返回了什么?它可能应该是同时使用ViewState和ControlState数据初始化的实例:
return new Pair([Restored ControlState], [Restored ViewState]);
值得一提的是,以下是我如何重写Save/LoadPageStateFromPersistenceMedium函数。基本上,它将viewstate存储在用户会话中,以加快回发速度:
// 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());
}
//灵感来自:http://aspalliance.com/72
常量字符串ViewStateFieldName=“\uuu VIEWSTATEKEY”;
常量字符串ViewStateKeyPrefix=“ViewState_389;”;
常量字符串RecentViewStateQueue=“ViewStateQueue”;
const int RecentViewStateQueueMaxLength=5;
受保护的重写对象LoadPageStateFromPersistenceMedium()
{
//此viewstate的缓存键存储在一个隐藏字段中,因此请抓取它
字符串viewStateKey=Request.Form[ViewStateFieldName]作为字符串;
if(viewStateKey==null)返回null;
//使用键获取viewstate数据以进行查找
返回会话[viewStateKey];
}
受保护的覆盖无效SavePageStateTPersistenceMedium(对象视图状态)
{
//给这个viewstate一个随机键
字符串viewStateKey=ViewStateKeyPrefix+Guid.NewGuid().ToString();
//存储视图状态
会话[viewStateKey]=视图状态;
//将viewstate的键存储在隐藏字段中,以便在回发时我们可以从缓存中获取它
RegisterHiddenField(ViewStateFieldName,viewStateKey);
//一些整理:跟踪此用户的X个最新视图状态,并删除旧视图
var recent=会话[RecentViewStateQueue]作为队列;
如果(最近==null)会话[RecentViewStateQueue]=recent=new Queue();
recent.Enqueue(viewStateKey);//添加这个新的,以便以后删除它
while(recent.Count>RecentViewStateQueueMaxLength)//如果队列中有很多,请删除旧的
Session.Remove(recent.Dequeue());
}
以下代码修复了它:
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));
}
}
我也尝试过,通过覆盖页面的PageStatePersister属性并返回“new SessionPageStatePersister(this)”,来实现这一点这与以前的结果相同。@Chris,您是否在自定义控件的OnInit中调用Page.RegisterRequestControlState?还有一件事要检查控件id是否被更改(或以后分配)。在我的SavePageStateToPersistenceMedium中,我只是保存传递的“viewState”对象,它是一对(我使用断点进行了测试)。加载后,我只需重新加载这一对。所以我假设这对已经是控件和视图状态了?保存时从哪里获取控件状态?Page.ControlState不存在。@Chris:base.PageStatePersister.ControlState