I followed the guide here to save my ViewState into the database. I did some changes to it to fit my projects code design, but the essential parts are there. But when I implant this solution all my asp:ImageButtons events stops working, but regular asp:Buttons seems to work. Why doesn't the events from asp:ImageButtons work?
Code:
public class DatabasePageStatePersister : PageStatePersister
{
//This object handles the saving and loading from database
CiroLightLibrary.BLL.ViewState myViewState;
public DatabasePageStatePersister(Page p, string GUID): base(p)
{
myViewState = new CiroLightLibrary.BLL.ViewState();
myViewState.GUID = GUID;
}
public override void Load()
{
myViewState.Load();
this.ViewState = this.StateFormatter.Deserialize(myViewState.Value);
}
public override void Save()
{
myViewState.Value = this.StateFormatter.Serialize(this.ViewState);
myViewState.Save();
}
}
public class PageViewStateDatabaseStored : Page
{
private PageStatePersister _PageStatePersister;
protected override System.Web.UI.PageStatePersister PageStatePersister
{
get
{
if (_PageStatePersister == null)
{
CiroLightLibrary.BLL.ViewState myViewState = new ViewState();
if (Request["__DATABASE_VIEWSTATE"] != null)
myViewState.GUID = Request["__DATABASE_VIEWSTATE"].ToString();
else
myViewState.GUID = Guid.NewGuid().ToString();
_PageStatePersister = new DatabasePageStatePersister(this, myViewState.GUID);
Literal l = new Literal();
l.Text = "<div><input type=\"hidden\" name=\"__DATABASE_VIEWSTATE\" value=\"" + myViewState.GUID + "\" /></div>";
this.Form.Controls.Add(l);
}
return _PageStatePersister;
}
}
}
And heres a Test page:
public partial class test : PageViewStateDatabaseStored
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
imgButton1.CommandArgument = "1";
btnButton1.CommandArgument = "1";
}
}
protected void imgButton_OnCommand(object sender, CommandEventArgs e)
{
Response.Write(e.CommandArgument.ToString());
}
protected void imgButton_OnClick(object sender, EventArgs e)
{
Response.Write("Click");
}
}
Asp.net Page
<form runat="server">
<asp:ImageButton ID="imgButton1" runat="server" OnCommand="imgButton_OnCommand" />
<asp:ImageButton ID="imgButton2" runat="server" OnClick="imgButton_OnClick" />
<asp:Button ID="btnButton1" runat="server" OnCommand="imgButton_OnCommand" />
<asp:Button ID="btnButton2" runat="server" OnClick="imgButton_OnClick" />
</form>
I tried to override LoadPageStateFromPersistenceMedium()
and SavePageStateToPersistenceMedium()
instead, and now my asp:ImageButtons also fires the events.
public class PageViewStateDatabaseStored : Page
{
protected override object LoadPageStateFromPersistenceMedium()
{
CiroLightLibrary.BLL.ViewState myViewState = new ViewState();
if (Request["__DATABASE_VIEWSTATE"] != null)
{
myViewState.GUID = Request["__DATABASE_VIEWSTATE"].ToString();
myViewState.Load();
}
LosFormatter myFormatter = new LosFormatter();
return myFormatter.Deserialize(myViewState.Value);
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
CiroLightLibrary.BLL.ViewState myViewState = new ViewState();
if (Request["__DATABASE_VIEWSTATE"] != null)
myViewState.GUID = Request["__DATABASE_VIEWSTATE"].ToString();
else
myViewState.GUID = Guid.NewGuid().ToString();
LosFormatter myFormatter = new LosFormatter();
StringWriter myStringWriter = new StringWriter();
myFormatter.Serialize(myStringWriter, viewState);
myViewState.Value = myStringWriter.ToString();
myViewState.Save();
ScriptManager.RegisterHiddenField(this, "__DATABASE_VIEWSTATE", myViewState.GUID);
}
}