ใน ASP.NET ViewState เป็นปัญหามาโดยตลอดเนื่องจากใช้พื้นที่จำนวนมากใน HTML ของไคลเอนต์และถูกส่งผ่านไปยังเครือข่ายซ้ำ ๆ ด้วย PostBack ของเพจ แต่ในความเป็นจริงแล้ว ViewState สามารถจัดเก็บไว้ที่ใดก็ได้ในฐานข้อมูล แคช ฯลฯ ดังนั้นจึงหลีกเลี่ยงการส่งสตริง base64 ที่มีความยาวไปยังไคลเอนต์บ่อยครั้ง การทำเช่นนี้ไม่เพียงแต่สามารถปรับปรุงประสิทธิภาพได้อย่างมาก (ลดจำนวนไบต์ที่ส่งผ่านเครือข่ายลงอย่างมาก) แต่ยังป้องกันไม่ให้เนื้อหาถอดรหัสและถอดรหัสได้ง่ายอีกด้วย ดังนั้นวิธีนี้จึงมีประโยชน์มาก
ตัวอย่างง่ายๆ เขียนไว้ด้านล่าง โดยใช้แคชเป็นปลายทางการจัดเก็บข้อมูล ViewState สำหรับแคชคีย์ สิ่งที่ให้ไว้ในบทความเป็นเพียงวิธีการเขียนง่ายๆ และสามารถวางแผนที่เข้มงวดได้ตามสถานการณ์
รหัสแสดงให้เห็นคร่าวๆ ดังนี้:
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<หัว>
<title>SaveViewStateToOther</title>
<meta name = "เครื่องกำเนิดไฟฟ้า" เนื้อหา = "Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema content=" http://schemas.microsoft.com/intellisense/ie5 ">
</หัว>
<body MS_POSITIONING="GridLayout">
<form id = "Form1" method = "โพสต์" runat = "เซิร์ฟเวอร์" <asp: DataGrid id = DataGrid1 style = "Z-INDEX: 101; LEFT: 104px; POSITION: สัมบูรณ์; TOP: 72px" runat = "เซิร์ฟเวอร์ " BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4" PageSize="6" AllowPaging="True">
<selecteditetemstyle font-bold="True" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="White">
</ItemStyle>
<headerstyle font-bold="True" forecolor="#CCCCFF" backcolor="#003399">
</HeaderStyle>
<footerstyle forecolor="#003399" backcolor="#99CCCC">
</FooterStyle>
<pagerstylehorizontalalign="Left" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="20" mode="NumericPages">
</เพจเจอร์สไตล์>
</asp:DataGrid>
</ฟอร์ม>
</ร่างกาย>
</html>
ใช้ระบบ;
ใช้ System.Data;
ใช้ System.IO;
ใช้ System.Text;
โดยใช้ System.Web.UI;
ใช้ System.Web.UI.WebControls
เนมสเปซ LinkedList
-
/// <สรุป>
/// คำอธิบายโดยสรุปของ SaveViewStateToOther
/// </สรุป>
คลาสสาธารณะ SaveViewStateToOther: หน้า
-
ป้องกัน DataGrid DataGrid1;
โมฆะส่วนตัว Page_Load (ผู้ส่งวัตถุ EventArgs e)
-
ถ้า (!IsPostBack)
ผูก();
} }
โมฆะส่วนตัวผูก()
-
ตาราง DataTable = DataTable ใหม่ ();
table.Columns.Add("id", typeof (int));
table.Columns.Add("name", typeof (string));
for (int i = 0; i < 1,000; i++)
-
แถว DataRow = table.NewRow();
แถว["id"] = ฉัน;
แถว["ชื่อ"] = "student_" + i.ToString();
ตาราง.Rows.Add(แถว);
-
DataGrid1.DataSource = ตาราง;
DataGrid1.DataBind();
}
#region รหัสที่สร้างโดย Web Form Designer
ป้องกันแทนที่เป็นโมฆะ OnInit (EventArgs e)
-
เตรียมใช้งานส่วนประกอบ();
ฐาน OnInit(e);
}
โมฆะส่วนตัว InitializeComponent()
-
this.DataGrid1.PageIndexChanged += System.Web.UI.WebControls.DataGridPageChangedEventHandler ใหม่ (this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
ป้องกันการแทนที่เป็นโมฆะ SavePageStateToPersistenceMedium (วัตถุ viewState)
-
รูปแบบ LosFormatter = LosFormatter ใหม่ ();
ผู้เขียน StringWriter = StringWriter ใหม่ ();
format.Serialize (ผู้เขียน, viewState);
string vsRaw =writer.ToString();
บัฟเฟอร์ไบต์ [] = Convert.FromBase64String (vsRaw);
string vsText = Encoding.ASCII.GetString (บัฟเฟอร์);
object v = Cache [PageKey];
ถ้า (v == โมฆะ)
แคชแทรก (PageKey, vsText);
อื่น
แคช[PageKey] = vsText;
}
PageKey สตริงสาธารณะ
-
รับ { กลับ Session.SessionID + "_page_SaveViewStateToOther_aspx";
}
วัตถุแทนที่การป้องกัน LoadPageStateFromPersistenceMedium()
-
วัตถุ s = แคช [PageKey];
ถ้า (s != null)
-
สถานะสตริง = s.ToString();
ไบต์ [] บัฟเฟอร์ = การเข้ารหัส ASCII.GetBytes (สถานะ);
string vsRaw = Convert.ToBase64String (บัฟเฟอร์);
ตัวจัดรูปแบบ LosFormatter = ใหม่ LosFormatter();
ส่งคืนฟอร์แมตเตอร์ดีซีเรียลไลซ์ (vsRaw);
-
กลับเป็นโมฆะ;
}
โมฆะส่วนตัว DataGrid1_PageIndexChanged (แหล่งที่มาของวัตถุ DataGridPageChangedEventArgs e)
-
DataGrid1.CurrentPageIndex = e.NewPageIndex;
ผูก();
-
-
-
สำหรับแอปพลิเคชันจริง หากคุณต้องการตัดสินใจใช้โซลูชันนี้ตลอดทั้งโปรแกรม ก็เหมาะสมกว่าที่จะใช้คลาสฐานเพจทั่วไปที่จะใช้กลไกนี้
ที่มา: Kinoho BLOG