في 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" >
<أتش تي أم أل>
<الرأس>
<title>SaveViewStateToOther</title>
<meta name="GENERATOR" Content="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="post" runat="server"><asp:DataGrid id=DataGrid1 style ="Z-INDEX: 101؛ اليسار: 104px؛ الموضع: مطلق؛ TOP: 72px" runat = "الخادم " BorderColor = "#3366CC" BorderStyle = "لا شيء" BorderWidth = "1px" BackColor = "أبيض" CellPadding = "4" PageSize = "6"AllowPaging = "True">
<selecteditemstylefont-bold="True" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="White">
</ItemStyle>
<headerstylefont-bold="True" forecolor="#CCCCFF" backcolor="#003399">
</HeaderStyle>
<footerstyle forecolor="#003399" backcolor="#99CCCC">
</FooterStyle>
<pagerstyle أفقي محاذاة = "Left" forecolor = "#003399" backcolor = "#99CCCC" pagebuttoncount = "20" mode = "NumericPages">
</بيجر ستايل>
</asp:DataGrid>
</form>
</الجسم>
</html>
باستخدام النظام؛
باستخدام System.Data؛
باستخدام System.IO؛
باستخدام System.Text؛
باستخدام System.Web.UI؛
باستخدام System.Web.UI.WebControls؛
مساحة الاسم LinkedList
{
/// <الملخص>
/// وصف موجز لـ SaveViewStateToOther.
/// </الملخص>
الفئة العامة SaveViewStateToOther: Page
{
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 < 1000; i++)
{
DataRowrow = table.NewRow();
صف["id"] = i;
صف["name"] = "student_" + i.ToString();
table.Rows.Add(row);
}
DataGrid1.DataSource = table;
DataGrid1.DataBind();
}
#رمز المنطقة الذي تم إنشاؤه بواسطة مصمم نماذج الويب
محمي بتجاوز void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
()InitializeComponent باطلة خاصة
{
this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
protected override void SavePageStateToPersistenceMedium(object viewState)
{
تنسيق LosFormatter = new LosFormatter();
StringWriterwriter = new StringWriter();
format.Serialize(writer, viewState);
string vsRaw =writer.ToString();
byte[] buffer = Convert.FromBase64String(vsRaw);
string vsText = Encoding.ASCII.GetString(buffer
object v = Cache[PageKey];
إذا (الخامس == فارغة)
Cache.Insert(PageKey, vsText);
آخر
Cache[PageKey] = vsText;
}
سلسلة عامة PageKey
{
الحصول على {return Session.SessionID + "_page_SaveViewStateToOther_aspx" }؛
}
كائن التجاوز المحمي LoadPageStateFromPersistenceMedium()
{
object s = Cache[PageKey];
إذا (ق ! = فارغة)
{
حالة السلسلة = s.ToString();
byte[] buffer = Encoding.ASCII.GetBytes(state);
string vsRaw = Convert.ToBase64String(buffer);
LosFormatter formatter = new LosFormatter();
إرجاع المنسق.Deserialize(vsRaw);
}
عودة فارغة؛
}
DataGrid1_PageIndexChanged باطلة خاصة (مصدر الكائن، DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
ربط()؛
}
}
}
بالنسبة للتطبيقات الفعلية، إذا كنت تريد أن تقرر تطبيق هذا الحل عبر البرنامج بأكمله، فمن الأفضل استخدام فئة أساسية مشتركة للصفحة لتنفيذ هذه الآلية.
المصدر: مدونة كينوهو