chiedo venia in anticipo per la lunghezza del post.
considera che è uno script in beta
devo rifinirlo testarlo a dovere e analizzare alcuni rischi di sicurezza che potrebbe comportare questo meccanismo.
insomma declino ogni responsabilità
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Configuration;
using System.Web;
using System.Web.Configuration;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.UI.Adapters;
using System.Security.Permissions;
/// <summary>
/// Summary description for SqlPageStatePersister
/// </summary>
namespace AspItalia
{
public class SqlStatePersister : PageStatePersister
{
#region query
public const string saveQuery =
@"
IF @GUID IS NULL
BEGIN
SET @GUID = NEWID()
INSERT INTO SqlViewState
(ID,Value, FirstAccess, LastAccess)
VALUES (@GUID ,@VIEWSTATE, GETDATE(), GETDATE())
END
ELSE
BEGIN
UPDATE SqlViewState
SET Value = @VIEWSTATE, LastAccess = GETDATE()
WHERE (ID = @GUID)
END";
public const string ReadQuery = "SELECT Value FROM SqlViewState WHERE ID = @GUID";
#endregion
public SqlStatePersister(Page page): base(page){ }
public override void Load()
{
//recupero il guid
string s = this.Page.Request.Form["__HiddenGuid"];
//se esiste
if (!string.IsNullOrEmpty(s))
{
//creo un nuovo guid
Guid id = new Guid(s);
//recupero il formatter
IStateFormatter formatter = this.StateFormatter;
//recupero la connessione
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings[0].ConnectionString);
try
{
//inizializzo una nuova istanza di SqlCommand
SqlCommand command = new SqlCommand(ReadQuery, connection);
//inizializzo il parametro @GUID e lo aggiungo al comando
SqlParameter guidParameter = new SqlParameter("@GUID", SqlDbType.UniqueIdentifier);
guidParameter.Value = id == Guid.Empty ? SqlGuid.Null : id;
guidParameter.Direction = ParameterDirection.Input;
command.Parameters.Add(guidParameter);
//apro la connessione
connection.Open();
//recupero il viewstate
object ob = command.ExecuteScalar();
//chiudo la connessione
connection.Close();
//deserializzo lo stao dei controlli
Pair pair = (Pair)formatter.Deserialize((string)ob);
//imposto il ViewState
ViewState = pair.First;
//imposto il ControlState
ControlState = pair.Second;
}
finally
{
if (connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
}
}
public override void Save()
{
//se il ViewState o il ControlState non sono nulli
if (this.ViewState != null || this.ControlState != null)
{
Pair statePair = new Pair(ViewState, ControlState);
//recupero il guid precedentemente salvato dal campo nascosto
string s = this.Page.Request.Form["__HiddenGuid"];
Guid guid;
try
{
//se è stato salvato
if (!string.IsNullOrEmpty(s))
{
//creoil guid
guid = new Guid(s);
}
else
{
guid = Guid.Empty;
}
}
catch
{
guid = Guid.Empty;
}
//salvo lo stato dei controlli sul DataBase
SaveOrUpdateViewStateToSqlServer(this.StateFormatter.Serialize(statePair), ref guid);
//instanzio una nuvo campo hidden per contenere il guid
HiddenField hiddenGuid = new HiddenField();
//li assegno un id
hiddenGuid.ID = "__HiddenGuid";
//salvo il guid
hiddenGuid.Value = guid.ToString();
//aggiungo HiddenField alla collezione del controllo HtmlForm
this.Page.Controls[3].Controls.Add(hiddenGuid);
}
}
private void SaveOrUpdateViewStateToSqlServer(string stringToSave, ref Guid id)
{
//inizializzo una nuova istanza di SqlConnection con la stringa di connessione
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings[0].ConnectionString);
try
{
//inizializzo SqlCommand
SqlCommand command = new SqlCommand(saveQuery, connection);
//istanzio e aggiungo il parametro @GUID
SqlParameter guidParameter = new SqlParameter("@GUID", SqlDbType.UniqueIdentifier);
guidParameter.Value = id == Guid.Empty ? SqlGuid.Null : id;
guidParameter.Direction = ParameterDirection.InputOutput;
command.Parameters.Add(guidParameter);
//istanzio e aggiungo il parametro @ViewState
SqlParameter viewStateParameter = new SqlParameter("@ViewState", SqlDbType.Text);
viewStateParameter.Direction = ParameterDirection.Input;
viewStateParameter.Value = stringToSave;
command.Parameters.Add(viewStateParameter);
//apro la connesione
connection.Open();
//eseguo l'inser o l'update
command.ExecuteNonQuery();
//chiudo la connessione
connection.Close();
//recupero il parametro di ritorno
id = ((SqlGuid)guidParameter.Value).Value;
}
finally
{
if (connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
}
}
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter
{
public override PageStatePersister GetStatePersister()
{
return new SessionPageStatePersister(this.Page);
}
}
}
ciao marco