C# LoadControlState未被解雇

C# LoadControlState未被解雇,c#,asp.net,user-controls,viewstate,C#,Asp.net,User Controls,Viewstate,我的自定义控件(从用户控件继承)有问题-我的LoadControlState没有被触发 确切地说,它通常会被激发,但当我重写页面的LoadPageStateFromPersistenceMedium和savePageStateTorPersistenceMedium函数时,它就不再被激发 LoadControlState没有被炒鱿鱼有什么典型的原因我应该调查一下吗?它什么时候被解雇有什么先决条件吗 感谢.NET 2.0以来的,建议您将状态持久化逻辑放在从派生的自定义类中。所以你可以试着采取这种方

我的自定义控件(从用户控件继承)有问题-我的LoadControlState没有被触发

确切地说,它通常会被激发,但当我重写页面的LoadPageStateFromPersistenceMedium和savePageStateTorPersistenceMedium函数时,它就不再被激发

LoadControlState没有被炒鱿鱼有什么典型的原因我应该调查一下吗?它什么时候被解雇有什么先决条件吗


感谢.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