2012-06-20 47 views
2

我想壓縮viewstate。因此我需要重寫屬於Web.UI.Page的SavePageStateToPersistenceMedium。在「正常」的ASP.Net很容易,但在我的SharePoint項目中我找不到任何地方,我有一個從Web.UI.Page繼承的類如何覆蓋Web.UI.Page - Sharepoint中的事件?

我的PageLayouts沒有代碼背後,也沒有masterPage 。

最好的解決方案是我可以在pageLayout中處理這個問題,因爲我不希望每個頁面都緩存ViewState。

爲了更清楚一點。這是我想提出「地方」的代碼:

public abstract class BasePage : System.Web.UI.Page 
{ 
    private ObjectStateFormatter _formatter = 
     new ObjectStateFormatter(); 

    protected override void 
     SavePageStateToPersistenceMedium(object viewState) 
    { 
     MemoryStream ms = new MemoryStream(); 
     _formatter.Serialize(ms, viewState); 
     byte[] viewStateArray = ms.ToArray(); 
     ClientScript.RegisterHiddenField("__COMPRESSEDVIEWSTATE", 
      Convert.ToBase64String(
      CompressViewState.Compress(viewStateArray))); 
    } 
    protected override object 
     LoadPageStateFromPersistenceMedium() 
    { 
     string vsString = Request.Form["__COMPRESSEDVIEWSTATE"]; 
     byte[] bytes = Convert.FromBase64String(vsString); 
     bytes = CompressViewState.Decompress(bytes); 
     return _formatter.Deserialize(
      Convert.ToBase64String(bytes)); 
    } 
} 
+0

一個快速的想法,也許不工作。創建一個委託控件,您將放入AdditionalPageHead。檢查控件的Init事件如果符合條件,並使用反射調用此受保護的屬性。 –

回答

1

我就從PublishingLayoutPage(在轉回來的路上inherits from Page)繼承,而不是讓我所有的頁面佈局使用此基礎頁面代碼隱藏。 這意味着你需要改變你的頁面佈局的頁面指令,如下所示:

<%@ Page Language="C#" Inherits="YourNameSpace.BasePage, $SharePoint.Project.AssemblyFullName$" %> 
+0

工作得很好。謝謝,Rikard –

+0

很高興能幫到你! –