2011-01-10 105 views
1

我遇到了自定义控件(从用户控件继承)的问题 - 我的LoadControlState未被触发。LoadControlState未被触发

嗯,确切地说:它被正常触发,但是当我重写页面的LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium函数时,它不再被触发。

是否有任何典型的原因LoadControlState没有被激发,我应该看看?当确实被解雇时,是否有任何先决条件?

感谢

回答

0

下面的代码固定它:

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)); 
     } 
    } 
0

由于.NET 2.0,则建议把你的状态持续的逻辑从PageStatePersister派生的自定义类。所以你可以尝试采取这种方法。

+0

我也试过了,通过覆盖Page的PageStatePersister属性和返回'新的SessionPageStatePersister(this);' - 这与之前的结果相同。 – Chris 2011-01-10 21:13:19

+1

@Chris,你在自定义控件的OnInit中调用了Page.RegisterRequiresControlState?还有一件事是检查控制ID是否发生变化(或稍后分配)。 – VinayC 2011-01-11 04:26:36

0

你从LoadPageStateFromPersistenceMedium方法实施返回什么?这大概应该是既ViewState中和了ControlState-数据初始化的System.Web.UI.Pair的一个实例:

return new Pair([Restored ControlState], [Restored ViewState]); 
1

对于它的价值,这里就是我如何重写保存/的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()); 
    }