ASP.NET 2.0的视图状态持久性机制(2)

2008-02-22 09:35:29来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  当然我们还可以通过写一个PageStatePersister新子类也可以完成上述功能,这是ASP.NET2.0新增的:

namespace PageAdapter
{
using System;
using System.IO;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;

[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]

public class DatabasePageStatePersister : PageStatePersister
{
 public DatabasePageStatePersister(Page page): base(page)
 {}
 //
 // Load ViewState and ControlState.
 //
 public override void Load()
 {
  string viewState;
  IStateFormatter formatter = this.StateFormatter;
  DataAccess da = new DataAccess();
  string stateID = base.Page.Request["__VIEWSTATE_KEY"].ToString();
  viewState = da.LoadViewState(stateID);
  Pair statePair = (Pair)formatter.Deserialize(viewState);
  ViewState = statePair.First;
  ControlState = statePair.Second;
 }
 //
 // Persist any ViewState and ControlState.
 //
 public override void Save()
 {
  if (ViewState != null || ControlState != null)
  {
   if (Page.Session != null)
   {
    string viewStateID = "VIEWSTATE#" base.Page.Session.SessionID.ToString() "#" DateTime.Now.Ticks.ToString();
    base.Page.ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", viewStateID);
    Pair statePair = new Pair(ViewState, ControlState);
    IStateFormatter formatter = this.StateFormatter;
    // Serialize the statePair object to a string.

    string serializedState = formatter.Serialize(statePair);
    ViewStateData vsd = new ViewStateData();
    vsd.ViewStateID = viewStateID;
    vsd.ViewState = serializedState;
    DataAccess da = new DataAccess();
    string error = da.SaveViewState(vsd);
   }
   else
    throw new InvalidOperationException("Session needed for StreamPageStatePersister.");
  }
 }
}

}

  再有重写PageStatePersister属性就可以了:

protected override PageStatePersister PageStatePersister
{
 get
 {
  return new DatabasePageStatePersister(Page);
 }
  文件

  这其实也跟数据库的差不了多少,我这只讲ASP.NET2.0的,在ASP.NET1.1也应该差不多,但我没有写代码调试:

  还是用那种写PageStatePersister新子类的办法:

namespace StreamPageAdapter
{
 using System;
 using System.IO;
 using System.Security.Permissions;
 using System.Web;
 using System.Web.UI;

 //
 // The StreamPageStatePersister is an example view state
 // persistence mechanism that persists view and control
 // state on the Web server.
 //

 [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]

 public class StreamPageStatePersister : PageStatePersister
 {
  public StreamPageStatePersister(Page page): base(page)
  {}
  //
  // Load ViewState and ControlState.
  //

  public override void Load()
  {
   Stream stateStream = GetSecureStream();
   // Read the state string, using the StateFormatter.
   StreamReader reader = new StreamReader(stateStream);
   IStateFormatter formatter = this.StateFormatter;
   string fileContents = reader.ReadToEnd();
   // Deserilize returns the Pair object that is serialized in
   // the Save method.
   Pair statePair = (Pair)formatter.Deserialize(fileContents);
   ViewState = statePair.First;
   ControlState = statePair.Second;
   reader.Close();
   stateStream.Close();
  }
  //
  // Persist any ViewState and ControlState.
  //

  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()
  {
   string path = @"d:\a.txt";
   FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
   return fs;
  }
 }
}

  再重写PageStatePersister属性就可以了:

protected override PageStatePersister PageStatePersister
{
 get
 {
  return new StreamPageStatePersister (Page);

 }

  通过上面的简单介绍,我们应该有所了解了,只是要明白的是:在ASP.NET1.1中我们只能通过重写age.SavePageStateToPersistenceMedium()和Page.LoadPageStateFromPersistenceMedium()来完成上述功能;而在ASP.NET2.0中,我们除了这外,还和通过写PageStatePersister新子类和重写PageStatePersister属性来完成,我是没有发现什么不同,当然如果在下面的内容你就明白,写PageStatePersister新子类的真正用处了。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:开发ASP.NET Atlas服务器端Extender控件—编写客户端Behavior

下一篇:ASP.net:Literal控件用法