No ASP.NET, o ViewState sempre foi um problema porque ocupa muito espaço no HTML do cliente e é passado repetidamente para a rede com o PostBack da página. Mas, na verdade, o ViewState pode ser armazenado em qualquer lugar do banco de dados, cache, etc., evitando assim o envio frequente de longas strings base64 para o cliente. Fazer isso pode não apenas melhorar significativamente o desempenho (reduzindo significativamente o número de bytes transmitidos pela rede), mas também evitar que o conteúdo seja facilmente descriptografado e quebrado. Portanto este método é muito útil.
Um exemplo simples está escrito abaixo, usando cache como destino de armazenamento do ViewState. Quanto à chave em cache, o que é fornecido no artigo é apenas um método simples de escrita, e um plano rigoroso pode ser fornecido de acordo com a situação.
O código é demonstrado aproximadamente da seguinte forma:
<%@ Page language="c#" Codebehind="SaveViewStateToOther.aspx.cs" AutoEventWireup="false" Inherits="LinkedList.SaveViewStateToOther" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<cabeça>
<title>SalvarViewStateToOther</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 ">
</head>
<corpo MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server"><asp:DataGrid id=DataGrid1 style="Z-INDEX: 101; ESQUERDA: 104px; POSIÇÃO: absoluta; SUPERIOR: 72px" runat="servidor " BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4" PageSize="6" AllowPaging="True">
<selecteditemstyle font-bold="True" forecolor="#CCFF99" backcolor="#009999">
</SelectedItemStyle>
<itemstyle forecolor="#003399" backcolor="Branco">
</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">
</PagerStyle>
</asp:DataGrid>
</form>
</body>
</html>
usando Sistema;
usando System.Data;
usando System.IO;
usando System.Text;
usando System.Web.UI;
usando System.Web.UI.WebControls
namespace LinkedList
;
{
/// <resumo>
/// Descrição resumida de SaveViewStateToOther.
/// </sumário>
classe pública SaveViewStateToOther: Página
{
DataGrid protegido DataGrid1;
private void Page_Load(objeto remetente, EventArgs e)
{
se (!IsPostBack)
Vincular();
}
privado void Bind()
{
tabela DataTable = new DataTable();
tabela.Columns.Add("id", typeof (int));
table.Columns.Add("nome", typeof (string));
for (int i = 0; i < 1000; i++)
{
Linha DataRow = tabela.NewRow();
linha["id"] = i;
linha["nome"] = "aluno_" + i.ToString();
tabela.Rows.Add(linha);
}
DataGrid1.DataSource = tabela;
DataGrid1.DataBind();
}
#region Código gerado pelo Web Form Designer
protected override void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.DataGrid1.PageIndexChanged += novo System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);
this.Load += new System.EventHandler(this.Page_Load }
#endregion
substituição
protegida void SavePageStateToPersistenceMedium(objeto viewState)
{
Formato LosFormatter = new LosFormatter();
Escritor StringWriter = new StringWriter();
formato.Serialize (escritor, viewState);
string vsRaw = escritor.ToString();
byte[] buffer = Convert.FromBase64String(vsRaw);
string vsText = Encoding.ASCII.GetString(buffer
objeto v = Cache[PageKey]);
se (v == nulo)
Cache.Insert(PageKey, vsText);
outro
Cache[PageKey] = vsText;
}
string pública PageKey
{
obter {retornar Session.SessionID + "_page_SaveViewStateToOther_aspx";
}
objeto de substituição protegido LoadPageStateFromPersistenceMedium()
{
objeto s = Cache[PageKey];
se (s! = nulo)
{
string estado = s.ToString();
byte[] buffer = Encoding.ASCII.GetBytes(estado);
string vsRaw = Convert.ToBase64String (buffer);
Formatador LosFormatter = new LosFormatter();
retornar formatador.Deserialize(vsRaw);
}
retornar nulo;
}
private void DataGrid1_PageIndexChanged(objeto fonte, DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
Vincular();
}
}
}
Para aplicativos reais, se você quiser decidir aplicar esta solução em todo o programa, é mais apropriado usar uma classe base de página comum para implementar esse mecanismo.
Fonte: BLOG Kinoho