ASP.NET에서 ViewState는 클라이언트의 HTML에서 많은 공간을 차지하고 페이지의 PostBack과 함께 네트워크에 반복적으로 전달되기 때문에 항상 문제가 되어 왔습니다. 그러나 실제로 ViewState는 데이터베이스, 캐시 등의 어느 곳에나 저장할 수 있으므로 긴 base64 문자열을 클라이언트에 자주 보내는 것을 방지할 수 있습니다. 이렇게 하면 성능이 크게 향상될 뿐만 아니라(네트워크를 통해 전송되는 바이트 수가 크게 감소) 콘텐츠가 쉽게 해독되고 크랙되는 것을 방지할 수도 있습니다. 그러므로 이 방법은 매우 유용하다.
아래에는 캐시를 ViewState 저장 대상으로 사용하는 간단한 예가 나와 있습니다. 캐시된 Key에 대해서는 기사에서 제시하는 것은 단순한 작성 방법일 뿐이며, 상황에 따라 엄격한 계획을 제시할 수 있습니다.
코드는 대략 다음과 같습니다.
<%@ Page 언어="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="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name=vs_defaultClientScript 콘텐츠="JavaScript">
<meta name=vs_targetSchema content=" http://schemas.microsoft.com/intellisense/ie5 ">
</head>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="서버"><asp:DataGrid id=DataGrid1 style="Z-INDEX: 101; 왼쪽: 104px; POSITION: 절대; 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="흰색">
</ItemStyle>
<headerstyle 글꼴-bold="True" forecolor="#CCCCFF" backcolor="#003399">
</HeaderStyle>
<footerstyle forecolor="#003399" backcolor="#99CCCC">
</FooterStyle>
<pagerstyle horizonalign="Left" forecolor="#003399" backcolor="#99CCCC" pagebuttoncount="20" mode="NumericPages">
</PagerStyle>
</asp:DataGrid>
</form>
</body>
</html>
시스템 사용;
System.Data 사용;
System.IO 사용;
System.Text 사용;
System.Web.UI 사용;
System.Web.UI.WebControls
네임스페이스 LinkedList
사용;
{
/// <요약>
/// SaveViewStateToOther에 대한 요약 설명입니다.
/// </summary>
공개 클래스 SaveViewStateToOther: 페이지
{
protected DataGrid DataGrid1;
private void Page_Load(객체 전송자, EventArgs e)
{
if (!IsPostBack)
묶다();
}
개인 무효 바인딩()
{
DataTable 테이블 = 새로운 DataTable();
table.Columns.Add("id", typeof (int));
table.Columns.Add("name", typeof (string));
for (int i = 0; i < 1000; i++)
{
DataRow 행 = table.NewRow();
행["id"] = i;
row["name"] = "student_" + i.ToString();
테이블.행.추가(행);
}
DataGrid1.DataSource = 테이블;
DataGrid1.DataBind();
}
#region 웹 양식 디자이너에 의해 생성된 코드
보호 재정의 void OnInit(EventArgs e)
{
초기화구성요소();
base.OnInit(e);
}
개인 무효 초기화 구성 요소()
{
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 형식 = 새로운 LosFormatter();
StringWriter 작가 = 새로운 StringWriter();
format.Serialize(writer, viewState);
문자열 vsRaw = 작가.ToString();
byte[] 버퍼 = Convert.FromBase64String(vsRaw);
string vsText = Encoding.ASCII.GetString(buffer)
객체 v = 캐시[PageKey];
if (v == null)
Cache.Insert(PageKey, vsText);
또 다른
캐시[PageKey] = vsText;
}
공개 문자열 PageKey
{
get { return Session.SessionID + "_page_SaveViewStateToOther_aspx" }
}
보호된 재정의 객체 LoadPageStateFromPersistenceMedium()
{
객체 s = 캐시[페이지키];
if (s != null)
{
문자열 상태 = s.ToString();
byte[] 버퍼 = Encoding.ASCII.GetBytes(state);
string vsRaw = Convert.ToBase64String(buffer);
LosFormatter 포맷터 = new LosFormatter();
return formatter.Deserialize(vsRaw);
}
null을 반환;
}
개인 무효 DataGrid1_PageIndexChanged(객체 소스, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
묶다();
}
}
}
실제 응용 프로그램의 경우 전체 프로그램에 걸쳐 이 솔루션을 적용하기로 결정하려면 이 메커니즘을 구현하는 공통 페이지 기본 클래스를 사용하는 것이 더 적절합니다.
출처: 키노호 블로그