29 messaggi dal 13 giugno 2002
Il viewstate di ASP.NET può risolvere molti problemi ma quando nella pagina cominciano ad esserci molti conponenti che necessitano del viewstate quosto può diventare un freno per le prestazioni.
Per cercare di risolvere questo problema ho fatto un piccolo esperimento che consiste nel salvare in una variabile di sessione il viewstate dei una pagina tramite l'override dei due metodi SavePageStateToPersistenceMedium e LoadPageStateFromPersistenceMedium dell'oggetto page.
Il problema è che non l'esperimento non funziona. Il viewstate viene effettivamente salvato nella variabile di session e dalla pagina sparisce il campo Hidden ma la pagina smette di funzionare.
Nella pagina in effetti è presente solo un pulsante che non risponde più all'evento onclick, mentre funziona perfettamente se tolgo la gestione del viewste.
Che cosa sbaglio ?

Ecco il codice della gestione del viewstate

Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object
Dim format = New LosFormatter()
Return Me.Context.Session(format.Deserialize(Session("ViewState_default")))
End Function

Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal viewState As Object)
Dim format = New LosFormatter()
Dim writer = New System.IO.StringWriter()
format.Serialize(writer, viewState)
Session("ViewState_default") = writer.ToString()
End Sub
Sai che ho provato anch'io, ma a me non parte proprio la sub di load del view state, sarà una cavolata, devo guardarci bene

Ciao

Il mio blog
Homepage
29 messaggi dal 13 giugno 2002
Ne ho proprio parlato con Dino Esposito ad un incontro Microsoft e secondo lui era una cosa abbastanza semplice.
Comunque anche a me non esegue la sub di load del view state. Se riesci a farla funzionare dimmelo....
Grazie
Beh ma infatti teoricamente è semplice se solo partisse questa sub. Appena ho tempo lo guardo

Ciao

Il mio blog
Homepage
29 messaggi dal 13 giugno 2002
Ho scaricato l'esempio di Dino Esposito (che tra l'atro consiglio a tutti perchè spiega veramente questo oggetto misterioso chiamato viewstate) e con mia grande sorpresa ho scoperto che l'esempio in C# di Esposito funziona mentre se lo traduco in VB.NET non funziona più, o meglio la funzione SavePageStateToPersistenceMedium viene regolamente chiamata, mentre la LoadPageStateFromPersistenceMedium non viene minimamente considerata. Capisco che MS sta spingendo C# ma questo mi sembra persino troppo !
Qualcuno mi può aiutare ?

Ecco il codice completo della pagina in VB

Public Class WebForm1
Inherits System.Web.UI.Page

Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox


#Region " Codice generato da Progettazione Web Form "

'Chiamata richiesta da Progettazione Web Form.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: questa chiamata al metodo è richiesta da Progettazione Web Form.
'Non modificarla nell'editor del codice.
InitializeComponent()
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Inserire qui il codice utente necessario per inizializzare la pagina
End Sub

Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object
Dim m_viewState As String
Dim m_formatter As LosFormatter
Dim viewStateBag As Object

Dim file As String = GetFileName()
Dim sr As StreamReader = New StreamReader(file)
m_viewState = sr.ReadToEnd()
sr.Close()

m_formatter = New LosFormatter()

viewStateBag = m_formatter.Deserialize(m_viewState)

Return viewStateBag
End Function

Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal viewState As Object)
Dim file As String = GetFileName()
Dim sw As StreamWriter = New StreamWriter(file)
Dim m_formatter As LosFormatter = New LosFormatter()
m_formatter.Serialize(sw, viewState)
sw.Close()
Return
End Sub

Private Function GetFileName() As String
Dim url As String = Request.ServerVariables("Path_Info")
Response.Write("---" + url)
url = url.Replace("/", "_")

Dim fileName As String = "{0}/{1}_{2}.viewstate"
fileName = String.Format(fileName, "ViewStateTemp", Session.SessionID, url)
Return Server.MapPath(fileName)
End Function


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = "prova di viewstate"
End Sub

End Class


<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="Webtest3.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 350px; POSITION: absolute; TOP: 63px" runat="server" Text="Button" Width="189px" Height="41px"></asp:Button>
<asp:TextBox id="TextBox1" style="Z-INDEX: 102; LEFT: 93px; POSITION: absolute; TOP: 68px" runat="server" Width="217px" Height="55px"></asp:TextBox>
</form>
</body>
</HTML>

No beh, ho provato a scriverlo anch'io in c# ma non la richiama

Ciao

Il mio blog
Homepage
29 messaggi dal 13 giugno 2002
Questo è il codice di Dino Esposito in C# e funziona perfettamente.
(se mi mandi la tua email ti invio il progetto)


using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;

namespace WebTest2
{

public class SimplePage : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox theInput;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.LinkButton Linkbutton1;

private void Page_Load(object sender, System.EventArgs e)
{
// Inserire qui il codice utente necessario per inizializzare la pagina.
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: questa chiamata è richiesta da Progettazione Web Form ASP.NET.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Metodo necessario per il supporto della finestra di progettazione. Non modificare
/// il contenuto del metodo con l'editor di codice.
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

protected override object LoadPageStateFromPersistenceMedium()
{
string m_viewState;
LosFormatter m_formatter;
object viewStateBag;

string file = GetFileName();
StreamReader sr = new StreamReader(file);
m_viewState = sr.ReadToEnd();
sr.Close();

m_formatter = new LosFormatter();

try
{
viewStateBag = m_formatter.Deserialize(m_viewState);
}
catch
{
throw new HttpException("The View State is invalid or corrupted");
}

return viewStateBag;
}

// ***********************************************************************

// ***********************************************************************
// Saves any view-state information for the page
protected override void SavePageStateToPersistenceMedium(object viewStateBag)
{
string file = GetFileName();
StreamWriter sw = new StreamWriter(file);
LosFormatter m_formatter = new LosFormatter();
m_formatter.Serialize(sw, viewStateBag);
sw.Close();
return;
}

// ***********************************************************************

//
// ***********************************************************************
// Determines the file name based on Session ID and URL
private string GetFileName()
{
string url = Request.ServerVariables["Path_Info"];
Response.Write("---" + url);
url = url.Replace("/", "_");

// Place the file in a temp folder (with write permissions)
string fileName = "{0}/{1}_{2}.viewstate";
fileName = String.Format(fileName, "ViewStateTemp", Session.SessionID, url);
return Server.MapPath(fileName);
}

private void Button1_Click(object sender, System.EventArgs e)
{
theInput.Text = "TEST viewstate";
}
// ***********************************************************************
}
}

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.