2013-05-02 75 views
0

上節省了查看和控制狀態讀一本書,我成功地創建一個類,這是比作爲基類重寫的負荷PageStatePersister對象,並保存方法提取和保存視圖狀態信息到服務器。然而,在本書中,作者建議轉到以下鏈接並查看示例以執行以下操作:如何創建Web服務器

而不是使用頁面基類,您可以使用頁面適配器。這將修改所有頁面的功能,而不必更改其基類。如果您想在服務器上爲所有頁面存儲ViewState,那麼這非常棒 。要了解 如何存儲的ViewState使用 PageAdapter類的GetStatePersister方法的所有頁面,請訪問:

所有我試圖做的是找到一種方法來保存ViewState中,而無需手動更改每個基類頁。

我得到以下錯誤:

[ArgumentNullException: Value cannot be null. 
Parameter name: stream] 
    System.IO.StreamWriter..ctor(Stream stream, Encoding encoding, Int32 bufferSize, Boolean leaveOpen) +10409245 
    System.IO.StreamWriter..ctor(Stream stream) +30 
    dev.StreamPageStatePersister.Save() in a:\Project\Application\Web\dev\StreamPageStatePersister.cs:57 
    System.Web.UI.Page.SavePageStateToPersistenceMedium(Object state) +108 
    System.Web.UI.Page.SaveAllState() +659 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1225 

下面是引用做到這一點的鏈接:

http://msdn.microsoft.com/en-us/library/system.web.ui.pagestatepersister.aspx

StreamPageStatePersister.cs代碼

namespace dev 
{ 

    using System; 
    using System.IO; 
    using System.Security.Permissions; 
    using System.Web; 
    using System.Web.UI; 

    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] 
    public class StreamPageStatePersister : PageStatePersister 
    { 

     public StreamPageStatePersister(Page page) 
      : base(page) 
     { 
     } 

     public override void Load() 
     { 
      Stream stateStream = GetSecureStream(); 

      StreamReader reader = new StreamReader(stateStream); 

      IStateFormatter formatter = this.StateFormatter; 
      string fileContents = reader.ReadToEnd(); 

      Pair statePair = (Pair)formatter.Deserialize(fileContents); 

      ViewState = statePair.First; 
      ControlState = statePair.Second; 
      reader.Close(); 
      stateStream.Close(); 
     } 

     public override void Save() 
     { 

      if (ViewState != null || ControlState != null) 
      { 
       if (Page.Session != null) 
       { 
        Stream stateStream = GetSecureStream(); 

        StreamWriter writer = new StreamWriter(stateStream); 

        IStateFormatter formatter = this.StateFormatter; 
        Pair statePair = new Pair(ViewState, ControlState); 

        // Serialize the statePair object to a string. 
        string serializedState = formatter.Serialize(statePair); 

        writer.Write(serializedState); 
        writer.Close(); 
        stateStream.Close(); 
       } 
       else 
        throw new InvalidOperationException("Session needed for StreamPageStatePersister."); 
      } 
     } 
     // Return a secure Stream for your environment. 
     private Stream GetSecureStream() 
     { 
      // You must provide the implementation to build 
      // a secure Stream for your environment. 
      return null; 
     } 
    } 
} 

MyPageAdapter.cs代碼

namespace dev { 

    using System.Security.Permissions; 
    using System.Web; 
    using System.Web.UI; 

    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] 
    public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter 
    { 

     public override PageStatePersister GetStatePersister() 
     { 
      return new dev.StreamPageStatePersister(Page); 
     } 
} } 

最後在瀏覽器中的文件:

<browsers> 
    <browser id="NewBrowser" parentID="Mozilla"> 
     <identification> 
      <userAgent match="Unique User Agent Regular Expression" /> 
     </identification> 

     <capture> 
      <userAgent match="NewBrowser (?'version'\d+\.\d+)" /> 
     </capture> 

     <capabilities> 
      <capability name="browser" value="My New Browser" /> 
      <capability name="version" value="${version}" /> 
     </capabilities> 
    </browser> 

    <browser refID="Mozilla"> 
     <capabilities> 
      <capability name="xml" value="true" /> 
     </capabilities> 

     <controlAdapters> 
     <adapter 
      controlType="System.Web.UI.Page" 
      adapterType="dev.MyPageAdapter" /> 
     </controlAdapters> 
    </browser> 
</browsers> 

回答

0

我想你應該確定瀏覽器的其餘部分的適配器。可以ü嘗試:

適配器類型= 「Samples.AspNet.CS.MyPageAdapter」/>