Vorwort
Solange Sie ein wenig Verständnis für ViewState haben, wissen Sie, dass ViewState in Asp.net-Seiten im Allgemeinen in einem versteckten Feld der Seite gespeichert wird:
Wenn wir die Quelldatei der Seite durchsuchen, sehen wir viele chaotische Dinge (insbesondere, wenn die Seite ein DataGrid mit einer großen Datenmenge oder eine GridView in ASP.NET 2.0 hat). Zeit, das ist ViewState.
Grundkenntnisse
Da es in ASP.NET 2.0 einige neue Änderungen am Persistenzspeichermechanismus von ViewState gibt, werde ich die relevanten Dinge kurz vorstellen.
In ASP.NET 1.1 wird nur der Persistenzmechanismus der verborgenen Domäne der Seite bereitgestellt, sodass Sie in einigen Fällen auf die Verwendung von ViewState verzichten müssen. Stellen Sie sich vor, Ihr DataGrid enthält Zehntausende Datensätze (denken Sie nicht). Dies ist nicht normal.) Es besteht keine Notwendigkeit (jemand ist darauf gestoßen). Sind Sie sicher, dass Ihr IIS-Server und das Netzwerk dem standhalten können, wenn ViewState aktiviert ist? Natürlich können Sie Ihren Speichermechanismus ändern, indem Sie die Methode Page.SavePageStateToPersistenceMedium() überschreiben, aber vergessen Sie nicht, Page.LoadPageStateFromPersistenceMedium() zu überschreiben, es handelt sich um ein Paar.
Der Standardmechanismus für die Persistenz des Ansichtszustands in ASP.NET 2.0 behält Zustandsinformationen weiterhin als Base64-codierte Zeichenfolge in einem ausgeblendeten HTML-Element auf der Seite (ein Element, dessen Typattribut auf „hidden“ festgelegt ist). ASP.NET-Seiten verwenden das HiddenFieldPageStatePersister-Objekt, um diese Arbeit auszuführen, und eine IStateFormatter-Instanz, um Objektstatusinformationen zu serialisieren und zu deserialisieren. Für mobile Clients mit begrenzter Bandbreite und Ressourcen können Sie auch die SessionPageStatePersister-Klasse verwenden, um den Ansichtsstatus der Seite im Session-Objekt auf dem Server zu speichern. Tatsächlich gibt es nur einen weiteren Session-Persistenzmechanismus Der Seitenstatus wird in der Sitzung und nicht in der Seite gespeichert, was eine Bandbreiteneinsparung bedeutet.
Wenn Sie jedoch ein tieferes Verständnis des ViewState-Persistenzmechanismus haben möchten, sollten Sie die abstrakte Klasse PageStatePersister kennen. Um den Ansichtsstatus auf einem Client beizubehalten, der den vorhandenen Ansichtsstatus-Persistenzmechanismus nicht unterstützen kann, können Sie die PageStatePersister-Klasse erweitern und Ihre einführen eigene Ansichtsstatus-Persistenzmethoden, und Sie können Seitenadapter verwenden, um ASP.NET-Anwendungen so zu konfigurieren, dass sie basierend auf dem Typ des Clients, für den die Seite bereitgestellt wird, unterschiedliche Ansichtsstatus-Persistenzmechanismen verwenden. Von der PageStatePersister-Klasse abgeleitete Klassen müssen die abstrakte Methode „Save“ überschreiben, um den Ansichtsstatus und den Steuerungsstatus im Persistenzmedium zu speichern, und die Load-Methode überschreiben, um Statusinformationen zu extrahieren. Wenn Sie den Ansichtsstatus und den Steuerelementstatus in Zeichenfolgen serialisieren müssen, können Sie das IStateFormatter-Objekt verwenden, auf das über die StateFormatter-Eigenschaft zugegriffen wird. Es serialisiert und deserialisiert Objektstatusinformationen effizient in Base64-codierte Zeichenfolgen. Sie können die StateFormatter-Eigenschaft auch überschreiben, um Ihren eigenen Objektstatus-Serialisierungsmechanismus bereitzustellen. Dies ist sehr einfach.
Dasversteckte Feld
„ViewState-Persistenzmechanismus“
wird nicht eingeführt. Dies ist das Standardfeld. Wie im Vorwort angegeben.
Die Sitzung
muss nur die PageStatePersister-Eigenschaft in ASP.NET2.0 überschreiben.
protected überschreiben PageStatePersister PageStatePersister
{
erhalten
{
return new SessionPageStatePersister(Page);
}
}
Wenn Sie diese beiden Methoden von LoadPageStateFromPersistenceMedium in ASP.NET1.1 überschreiben müssen:
protected override object LoadPageStateFromPersistenceMedium()
{
return Session["ViewState"];
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
Session["ViewState"] = viewState;
RegisterHiddenField("__VIEWSTATE", "");
}
Die Datenbank (mein Beispiel ist SQL Server2000)
ist in ASP1.1. Ich weiß nicht, was der Zweck ist. Sie werden mich später verstehen . Der folgende Code ist nur aus meinem Quellcode kopiert. Sie müssen ihn überhaupt nicht so schreiben, außer den notwendigen.
protected override void SavePageStateToPersistenceMedium(Objektstatus)
{
string viewStateID = "VIEWSTATE#" + Session.SessionID.ToString() + "#" + DateTime.Now.Ticks.ToString();
ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", viewStateID);
ClientScript.RegisterHiddenField("__VIEWSTATE","");//Bitte beachten Sie,
versuchen Sie es
{
if (losFormatter == null)
{
losFormatter = new LosFormatter();
}
StringWriter sw = new StringWriter();
losFormatter.Serialize(sw, state);
Common.ViewStateData vsd = new ViewStateData();
vsd.ViewStateID = viewStateID;
vsd.ViewState = sw.ToString();
da = new DataAccess();
string error = da.SaveViewState(vsd);
Response.Write(error);
}
Catch (Ausnahme ex)
{
Response.Write(ex.Message);
}
}
protected override object LoadPageStateFromPersistenceMedium()
{
string viewState = string.Empty;
versuchen
{
if (losFormatter == null)
{
losFormatter = new LosFormatter();
}
string stateID = Page.Request["__VIEWSTATE_KEY"].ToString();
da = new DataAccess();
viewState = da.LoadViewState(stateID);
}
fangen
{}
return losFormatter.Deserialize(viewState);
}
Diese Codezeile ist in ASP2.0 grundsätzlich in Ordnung. Da es sich um die obige Zeile ClientScript.RegisterHiddenField("__VIEWSTATE","");
handelt, ist sie in Asp identisch .net1.1 Es ist auch möglich. Ich habe auch auf den Code anderer Leute verwiesen und diese Zeile hinzugefügt. Nach dem Hinzufügen dieser Zeile gibt es nur einen zusätzlichen
>
.
Nach dem Ausführen befinden sich in der Quelldatei der Seite zwei solcher Dinge. Es ist in Ordnung, diese Zeile zu entfernen, daher verstehe ich nicht, wofür die Aussage verwendet wird. Bitte sagen Sie es mir klar. Aber es funktioniert nicht in Asp.net2.0. Es gibt den folgenden Fehler:
Die Statusinformationen sind für diese Seite ungültig und möglicherweise beschädigt.
Ich war damals noch nie auf einen solchen Fehler gestoßen. und ich kann bei der Google-Suche nichts finden, ich weiß nicht, ob dieser Satz seit zwei Tagen falsch ist und ich den gesamten Prozess nicht lösen kann Beim Speichern des Ansichtsstatus in der Datenbank und beim Lesen aus der Datenbank konnte ich den Fehler nicht finden, also dachte ich immer wieder über den Code nach, war aber etwas verwirrt über diese Zeile Feld von „__VIEWSTATE“, also habe ich diese Zeile auskommentiert und es hat tatsächlich funktioniert. Ich verstehe also immer noch nicht, wozu diese Zeile dient.
Natürlich können wir die oben genannten Funktionen auch vervollständigen, indem wir eine neue Unterklasse von PageStatePersister schreiben, die in ASP.NET2.0 neu ist:
Namespace PageAdapter
{
Verwenden des Systems;
mit System.IO;
Verwenden von System.Security.Permissions;
mit System.Web;
using System.Web.UI;
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
öffentliche Klasse DatabasePageStatePersister: PageStatePersister
{
public DatabasePageStatePersister(Page page): base(page)
{}
//
// ViewState und ControlState laden.
//
öffentliches 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;
}
//
// Behalten Sie jeden ViewState und ControlState bei.
//
öffentliches 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);
Paar statePair = neues Paar(ViewState, ControlState);
IStateFormatter formatter = this.StateFormatter;
// Das statePair-Objekt in einen String serialisieren.
serializedState = formatter.Serialize(statePair);
ViewStateData vsd = new ViewStateData();
vsd.ViewStateID = viewStateID;
vsd.ViewState = serializedState;
DataAccess da = new DataAccess();
string error = da.SaveViewState(vsd);
}
anders
throw new InvalidOperationException("Sitzung für StreamPageStatePersister erforderlich.");
}
}
}
}
Dann können Sie die PageStatePersister-Eigenschaft überschreiben:
protected override PageStatePersister PageStatePersister
{
erhalten
{
return new DatabasePageStatePersister(Page);
}
die Datei
nicht wesentlich von der Datenbank. Ich spreche nur von ASP.NET2.0. Sie sollte in ASP.NET1.1 ähnlich sein, aber ich habe den Code zum Debuggen nicht geschrieben:
Ich verwende die Methode immer noch des Schreibens einer neuen Unterklasse von PageStatePersister:
Namespace StreamPageAdapter
{
Verwenden des Systems;
mit System.IO;
Verwenden von System.Security.Permissions;
mit System.Web;
mit System.Web.UI
;
// Der StreamPageStatePersister ist ein Beispiel-Ansichtsstatus
// Persistenzmechanismus, der die Ansicht und Kontrolle beibehält
// Status auf dem Webserver.
//
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
öffentliche Klasse StreamPageStatePersister: PageStatePersister
{
public StreamPageStatePersister(Page page): base(page)
{}
//
// ViewState und ControlState laden.
//
öffentliches Override void Load()
{
Stream stateStream = GetSecureStream();
// Lesen Sie die Statuszeichenfolge mit dem StateFormatter.
StreamReader-Reader = new StreamReader(stateStream);
IStateFormatter formatter = this.StateFormatter;
string fileContents = reader.ReadToEnd();
// Deserilize gibt das Pair-Objekt zurück, in dem serialisiert wird
// die Save-Methode.
Pair statePair = (Pair)formatter.Deserialize(fileContents);
ViewState = statePair.First;
ControlState = statePair.Second;
Reader.Close();
stateStream.Close();
}
//
// Behalten Sie jeden ViewState und ControlState bei.
//
öffentliches Override void Save()
{
if (ViewState != null || ControlState != null)
{
if (Page.Session != null)
{
Stream stateStream = GetSecureStream();
StreamWriterwriter = new StreamWriter(stateStream);
IStateFormatter formatter = this.StateFormatter;
Pair statePair = new Pair(ViewState, ControlState);
// Das statePair-Objekt in einen String serialisieren.
string serializedState = formatter.Serialize(statePair);
Writer.Write(serializedState);
Writer.Close();
stateStream.Close();
}
anders
throw new InvalidOperationException("Sitzung für StreamPageStatePersister erforderlich.");
}
}
// Einen sicheren Stream für Ihre Umgebung zurückgeben.
GetSecureStream().
{
string path = @"d:a.txt";
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
fs zurückgeben;
}
}
}
Überschreiben Sie einfach die PageStatePersister-Eigenschaft:
protected override PageStatePersister PageStatePersister
{
erhalten
{
return new StreamPageStatePersister (Page)
;
Durch die obige kurze Einführung sollten wir ein gewisses Verständnis haben, aber was wir verstehen müssen, ist: In ASP.NET1.1 können wir die oben genannten Funktionen nur durch Umschreiben von age.SavePageStateToPersistenceMedium() und Page.LoadPageStateFromPersistenceMedium() vervollständigen .NET1.1 In ASP.NET2.0 vervollständigen wir es auch, indem wir eine neue Unterklasse von PageStatePersister schreiben und die PageStatePersister-Eigenschaft überschreiben. Wenn Sie den folgenden Inhalt lesen, habe ich natürlich keinen Unterschied festgestellt , werden Sie verstehen, dass das Schreiben einer neuen Unterklasse von PageStatePersister von echtem Nutzen ist.
Verwenden des Seitenadapters
Da der Zustandspersistenzmechanismus mit adaptivem Rendering und clientseitiger Funktionalität zusammenhängt, wird MyPageAdapter bereitgestellt, um den DatabasePageStatePersister der ASP.NET-Anwendung zu aktivieren. Schließlich wird eine Datei mit Browserfunktionen (.browser) bereitgestellt, um den MyPageAdapter für eine bestimmte Klasse von Clients (in diesem Fall den Standard-Webbrowser) zu aktivieren.
Diese Inhalte finden Sie im PageAdapter-Projekt im von mir bereitgestellten Quellcode. Sie werden es verstehen, nachdem Sie es gelesen haben.
Verwenden von System.Security.Permissions;
mit System.Web;
mit System.Web.UI;
Namespace PageAdapter
{
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
öffentliche Klasse MyPageAdapter: System.Web.UI.Adapters.PageAdapter
{
öffentliche Überschreibung PageStatePersister GetStatePersister()
{
return new PageAdapter.DatabasePageStatePersister(Page);
}
}
}
Um schließlich den MyPageAdapter-Adapter zu aktivieren, müssen Sie im Stammverzeichnis der ASP.NET-Anwendung ein Verzeichnis namens App_Browsers erstellen und eine .browser-Datei mit den Konfigurationsinformationen hinzufügen (tatsächlich werden diese alle hinzugefügt, wenn Sie sie hinzufügen). zum Projekt Eine .browser-Datei wird von vs2005 automatisch für Sie vervollständigt. Das
<browser refID="Default" >
<controlAdapters>
<Adapter
controlType="System.Web.UI.Page"
adapterType="PageAdapter.MyPageAdapter" />
</controlAdapters>
</browser>
</browsers>
Dies ist im TestPageAdapter-Projekt im Quellcode zu sehen. Dieses Projekt wird zur Demonstration des Seitenadapters verwendet.
Die Schlussfolgerung
ist relativ einfach und möglicherweise nicht ganz klar. Was die Vor- und Nachteile verschiedener Persistenzmechanismen betrifft, habe ich sie nicht speziell getestet, und der letzte Punkt „Seitenadapter verwenden“ ist kein Persistenzmechanismus, sondern verwendet einen Adapter Daher werden wir das PageStatePersister-Attribut nicht überschreiben
. Es scheint mir nicht sehr nützlich zu sein, da wir die Aktion zum Überschreiben von PageStatePersister in die Seitenbasisklasse einfügen können und alle anderen Seiten diese Basisklasse erben können Wie es in meinem Code ist, ist die Verwendung dieses Seitenadapters. Natürlich weiß ich nicht viel über den Seitenadapter.
Außerdem eine kurze Erklärung meines Quellcodes:
1. PageAdapter-Projekt
DatabasePageStatePersister.cs: eine Unterklasse der PageStatePersister-Klasse MyPageAdapter.cs: Seitenadapter DataAccess.cs und ViewSate.cs-Datenbankzugriff, gehören zur Hilfsklasse.
2. Das StreamPageAdapter-Projekt
ähnelt dem oben genannten, daher werde ich nicht auf Details eingehen.
3. SaveStateToDatabase-Projekt
StateInHiddenField.aspx: Testen Sie den Standardspeichermechanismus, das heißt, Sie können beim Betrachten viele chaotische Dinge sehen die Seitenquelldatei.
StateInSession.aspx: Der Speichermechanismus ist Session
StateInDatabase.aspx: Der Speichermechanismus-Datenbank ist der Typ der Rewrite-Methode. Er kann von asp.net1.1 und 2.0 verwendet werden.
StateInDatabase2.aspx: Schreiben Sie eine neue Unterklasse von PageStatePersister und überschreiben Sie die PageStatePersister-Eigenschaft.
StateInFile.aspx: Speichern Sie ViewState in einem Ordner auf dem Server.
4. TestPageAdater-Projekt.
Wird für Tests und Adapter verwendet.