Di ASP.NET, ViewState selalu menjadi masalah karena menempati sejumlah besar ruang di HTML klien dan berulang kali diteruskan ke jaringan dengan halaman PostBack. Namun kenyataannya, ViewState dapat disimpan di mana saja di database, cache, dll., sehingga menghindari seringnya pengiriman string base64 yang panjang ke klien. Melakukan hal ini tidak hanya dapat meningkatkan kinerja secara signifikan (secara signifikan mengurangi jumlah byte yang dikirimkan melalui jaringan), namun juga mencegah konten agar tidak mudah didekripsi dan diretas. Oleh karena itu cara ini sangat bermanfaat.
Contoh sederhana ditulis di bawah ini, menggunakan cache sebagai tujuan penyimpanan ViewState. Adapun Kunci cache, yang diberikan dalam artikel hanyalah metode penulisan sederhana, dan rencana yang ketat dapat diberikan sesuai dengan situasi.
Kode tersebut secara kasar ditunjukkan sebagai berikut:
<%@ Page Language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transisi//EN" >
<html>
<kepala>
<title>SimpanViewStateToOther</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Konten="C#">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema content=" http://schemas.microsoft.com/intellisense/ie5 ">
</kepala>
<badan MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server"><asp:DataGrid id=DataGrid1 style="Z-INDEX: 101; KIRI: 104px; POSISI: absolut; ATAS: 72px" runat="server " BorderColor="#3366CC" BorderStyle="Tidak Ada" BorderWidth="1px" BackColor="Putih" CellPadding="4" PageSize="6" AllowPaging="True">
<selecteditemstyle font-bold="Benar" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="Putih">
</ItemStyle>
<headerstyle font-bold="True" forecolor="#CCCCFF" backcolor="#003399">
</HeaderStyle>
<footerstyle forecolor="#003399" backcolor="#99CCCC">
</FooterStyle>
<pagerstyle horizontalalign="Left" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="20" mode="NumericPages">
</Gaya Pager>
</asp:DataGrid>
</form>
</tubuh>
</html>
menggunakan Sistem;
menggunakan Sistem.Data;
menggunakan Sistem.IO;
menggunakan Sistem.Teks;
menggunakan Sistem.Web.UI;
menggunakan System.Web.UI.WebControls
;
{
/// <ringkasan>
/// Ringkasan deskripsi SaveViewStateToOther.
/// </ringkasan>
kelas publik SaveViewStateToOther : Halaman
{
DataGrid DataGrid1 yang dilindungi;
private void Page_Load (pengirim objek, EventArgs e)
{
jika (!IsPostBack)
Mengikat();
}
kekosongan pribadi Bind()
{
Tabel DataTable = DataTable baru();
tabel.Kolom.Tambahkan("id", typeof(int));
tabel.Kolom.Tambahkan("nama", typeof (string));
untuk (int i = 0; i < 1000; i++)
{
Baris DataRow = tabel.NewRow();
baris["id"] = saya;
baris["nama"] = "siswa_" + i.ToString();
tabel.Baris.Tambahkan(baris);
}
DataGrid1.DataSource = tabel;
DataGrid1.DataBind();
}
#Kode wilayah yang dihasilkan oleh Perancang Formulir Web
yang dilindungi override void OnInit(EventArgs e)
{
Inisialisasi Komponen();
base.OnInit(e);
}
kekosongan pribadi InitializeComponent()
{
this.DataGrid1.PageIndexChanged += Sistem baru.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
protected override void SavePageStateToPersistenceMedium(object viewState)
{
Format LosFormatter = LosFormatter baru();
Penulis StringWriter = StringWriter baru();
format.Serialize(penulis, viewState);
string vsRaw = penulis.ToString();
byte[] buffer = Konversi.FromBase64String(vsRaw);
string vsText = Pengkodean.ASCII.GetString(buffer)
;
jika (v == nol)
Cache.Sisipkan(PageKey, vsText);
kalau tidak
Cache[PageKey] = vsTeks;
}
string publik PageKey
{
dapatkan { kembalikan Session.SessionID + "_page_SaveViewStateToOther_aspx";
}
objek override yang dilindungi LoadPageStateFromPersistenceMedium()
{
objek s = Cache[PageKey];
jika (s != nol)
{
status string = s.ToString();
byte[] buffer = Pengkodean.ASCII.GetBytes(status);
string vsRaw = Konversi.ToBase64String(buffer);
Pemformat LosFormatter = LosFormatter baru();
kembalikan formatter.Deserialize(vsRaw);
}
kembalikan nol;
}
private void DataGrid1_PageIndexChanged(sumber objek, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Mengikat();
}
}
}
Untuk aplikasi sebenarnya, jika Anda ingin memutuskan untuk menerapkan solusi ini di seluruh program, akan lebih tepat menggunakan kelas dasar halaman umum untuk mengimplementasikan mekanisme ini.
Sumber: BLOG Kinoho