Search code examples
c#asp.netviewstate

Storing Viewstate in Database disables my asp:ImageButtons events


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>

Solution

  • 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);
        }
    }