上節省了查看和控制狀態讀一本書,我成功地創建一個類,這是比作爲基類重寫的負荷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>