Search code examples
c#listvieweventsviewstate

Failed to load viewstate


OK have just started getting this error and I'm not sure why. I have a hosting page which has listview and a panel with a usercontrol. The listview loads up records with a linkbutton. You click the link button to edit that particular record - which gets loaded up in the formview (within the usercontrol) which goes to edit mode. After an update occurs in the formview I'm triggering an event which my hosting page is listening for. The hosting page then rebinds the listview to show the updated data. This is all inside an updatepanel.

So this all works - but when I then go to click on a different linkbutton I get the below error:

Message: Sys.WebForms.PageRequestManagerServerErrorException: Failed to load viewstate.  The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.

Any suggestions on how to fix?

My listview appears to be being rebound successfully - I can see my changed data.. I just don't know why its complaining about viewstate when I click on the linkbutton. Or is there a better way to update the data in my listview? My listview and formview are bound to objectdata sources (in case that matters)

Thanks for the help!

Here is the codebehind of my control. Other people have commented on this error being in relation to changing the mode of formview but have tried a few changes without success:

public partial class UserControls_RatesEditDate : System.Web.UI.UserControl
{

    public delegate void EditDateRateEventHandler(DateTime theDateTime);
    public event EditDateRateEventHandler EditDateRateSelected;

    public delegate void UpdateDateRateEventHandler();
    public event UpdateDateRateEventHandler EditDateRateUpdated;

    public int PropertyID { get; set; }
    public int AccommodationTypeID { get; set; }
    public DateTime TheDateTime { get; set; }
    public PropertyCMSRate Rate { get; set; }

    // display filters
    public bool DisplayMTABuy { get; set; }
    public bool DisplayMTASell { get; set; }
    public bool DisplayAffiliate { get; set; }
    public bool DisplayWeekly { get; set; }
    public bool DisplayThirtyDay { get; set; }
    public bool DisplayFlexi { get; set; }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        if (Rate != null || TheDateTime != DateTime.MinValue)
        {
            if (TheDateTime == DateTime.MinValue)
            {
                frmViewRatesDate.DataSource = new List<PropertyCMSRate> { Rate };
            }
            else
            {
                PropertyCMSRateItemDs.SelectParameters["propertyID"].DefaultValue = PropertyID.ToString();
                PropertyCMSRateItemDs.SelectParameters["accommodationTypeId"].DefaultValue = AccommodationTypeID.ToString();
                PropertyCMSRateItemDs.SelectParameters["theDateTime"].DefaultValue = TheDateTime.ToString();
                frmViewRatesDate.DataSourceID = "PropertyCMSRateItemDs";

                frmViewRatesDate.ChangeMode(FormViewMode.Edit);
            }

            frmViewRatesDate.DataBind();

            if (frmViewRatesDate.CurrentMode == FormViewMode.Edit)
            {
                ((HiddenField)frmViewRatesDate.FindControl("hdnPropertyID")).Value = PropertyID.ToString();
                ((HiddenField)frmViewRatesDate.FindControl("hdnAccommTypeID")).Value = AccommodationTypeID.ToString();

            }

        }
    }

    protected void lnkEditDate_Click(object sender, EventArgs e)
    {
        if (EditDateRateSelected != null)
            EditDateRateSelected(Convert.ToDateTime(((LinkButton)frmViewRatesDate.Row.FindControl("lnkEditDate")).Text));

    }

    protected void btnUpdate_Click(object sender, EventArgs e)
    {

        if (Page.IsValid)
        {
            if (EditDateRateUpdated != null)
                EditDateRateUpdated();
        }

    }

    protected void frmViewRatesDate_ItemCommand(object sender, FormViewCommandEventArgs e)
    {
        if (e.CommandName == "Update")
        {
            PropertyCMSRateItemDs.UpdateParameters["propertyId"].DefaultValue = ((HiddenField)frmViewRatesDate.FindControl("hdnPropertyID")).Value;
            PropertyCMSRateItemDs.UpdateParameters["accommodationTypeId"].DefaultValue = ((HiddenField)frmViewRatesDate.FindControl("hdnAccommTypeID")).Value;
            PropertyCMSRateItemDs.UpdateParameters["minStay"].DefaultValue = ((DropDownList)frmViewRatesDate.FindControl("EditPriceMinStayList")).SelectedValue;
        }
    }

    protected void PropertyCMSRateItemDs_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {

        if (EditDateRateUpdated != null)
            EditDateRateUpdated();
    }
}

OK here is my aspx page - sorry realised that might help after I left the office to grab food. :) Have put a comment before my listview containing that word..

<%@ MasterType VirtualPath="~/Properties-Cms/AddEdit.master" %>
<%@ Register Src="../UserControls/RatesEditDate.ascx" TagName="RatesEditDate" TagPrefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <Triggers>
        </Triggers>
        <ContentTemplate>
                <asp:ValidationSummary ID="ValidationSummary1" runat="server" ValidationGroup="Main" />
            <div class="bluebox">
                <asp:ValidationSummary ID="ValidationSummary2" runat="server" ValidationGroup="AddAccommodationType" />
                <asp:CustomValidator ID="DisplayPriceValidation" Display="Dynamic" runat="server" OnServerValidate="DisplayPrice_Validated"
                                ValidationGroup="Main" ErrorMessage="Please ensure you have selected Accommodation and selected a valid display rates option">
                            </asp:CustomValidator>
                <div class="col33">
                    <!-- accommodation -->
                    <div class="field">
                        <asp:Label ID="Label1" runat="server" Text="Select Accommodation" AssociatedControlID="Accommodations1" />
                        <asp:DropDownList ID="Accommodations1" runat="server" AutoPostBack="true" DataTextField="AccommodationTypeDescription"
                            DataValueField="Id" OnDataBound="Accommodations1_DataBound" OnSelectedIndexChanged="Accommodations1_SelectedIndexChanged"
                            Width="200px" DataSourceID="AccommodationDs">
                        </asp:DropDownList>
                        <asp:ObjectDataSource ID="AccommodationDs" runat="server" OldValuesParameterFormatString="original_{0}"
                            SelectMethod="ListByPropertyId" TypeName="Shared.MtaLib.Bll.PropertyAccommodationController">
                            <SelectParameters>
                                <asp:Parameter Name="PropertyId" Type="Int32" />
                            </SelectParameters>
                        </asp:ObjectDataSource>
                    </div>
                </div>
                <!-- middle column -->
                <div class="col33">
                    <ul style="list-style-type: none;">
                        <li>
                            <asp:Label ID="Label100" runat="server" Text="Accommodation" AssociatedControlID="lblAccom" />&nbsp;<asp:Label
                                ID="lblAccom" runat="server" Text="" /></li>
                        <li>
                            <asp:Label ID="Label101" runat="server" Text="Local Label" AssociatedControlID="lblLocalLabel" />&nbsp;<asp:Label
                                ID="lblLocalLabel" runat="server" Text="" /></li>
                    </ul>
                </div>
                <!--Right hand side Level 1 -->
                <div class="col33">
                    <asp:Button runat="server" ID="btnAddAccommodation" Text="Add Accommodation" OnClick="btnAddAccommodation_Click" /><br />
                    <br />
                    <asp:LinkButton runat="server" ID="lnkEditAccommodation" Text="View/Edit available Accommodations"
                        OnClick="lnkEditAccommodation_Click" />
                    <br />
                </div>
                <div style="clear: both;">
                </div>
            </div>
            <!--Left hand side Level 2 -->
            <asp:Panel runat="server" ID="pnlViewAccommodationRatesDates">
                <div style="clear: both;" />
                <div class="box">
                    <div class="col40">
                        Display rates Range<br />
                        <asp:RadioButton ID="ViewRange" runat="server" GroupName="DisplayDate" Checked="true" />
                        <asp:Label runat="server" ID="Label5" AssociatedControlID="txtDisplayFrom" Text="From" />
                        <asp:TextBox ID="txtDisplayFrom" runat="server"></asp:TextBox>
                        <asp:Label runat="server" ID="Label6" AssociatedControlID="txtDisplayTo" Text="To" />
                        <asp:TextBox ID="txtDisplayTo" runat="server"></asp:TextBox>
                    </div>
                    <div class="col20">
                        <br />
                        <asp:RadioButton ID="ViewRange1" runat="server" GroupName="DisplayDate" Text="Next 1 month" /><br />
                        <asp:RadioButton ID="ViewRange3" runat="server" GroupName="DisplayDate" Text="Next 3 month" /><br />
                        <asp:RadioButton ID="ViewRange6" runat="server" GroupName="DisplayDate" Text="Next 6 month" />
                    </div>
                    <div class="col20">
                        Show<br />
                        <asp:CheckBox ID="chkDisplayMTABuy" runat="server" Text="MTA Buy" Checked="true" /><br />
                        <asp:CheckBox ID="chkDisplayMTASell" runat="server" Text="MTA Sell" Checked="true" /><br />
                        <asp:CheckBox ID="chkDisplayAffiliateNett" runat="server" Text="Affiliate Nett" Checked="true" /><br />
                        <asp:CheckBox ID="chkDisplayWeekly" runat="server" Text="Weekly" Checked="true" /><br />
                        <asp:CheckBox ID="chkDisplay30Day" runat="server" Text="30 Day" Checked="true" /><br />
                        <asp:CheckBox ID="chkDisplayFlexi" runat="server" Text="Flexi" Checked="true" />
                    </div>
                    <div class="col20">
                        <br />
                        <br />
                        <br />
                        <asp:Button ID="btnDisplayRates" runat="server" Text="Display Rates" OnClick="btnDisplayRates_Click" />
                        <br />
                        <br />
                        <asp:LinkButton ID="lnkAddEditRate" runat="server" Text="Add / Edit Rates" OnClick="lnkAddEditRate_Click" />
                    </div>
                    <div style="clear: both;" />
                </div>
            </asp:Panel>
            <!-- hidden panel removed as I'm out of characters -->
            <!-- Listview containing user control.. usercontrol has formview with a linkbutton -->
            <asp:Panel runat="server" ID="pnlViewAccommodationRates" Visible="false">
                <div class="propertyaddedit_ratesbox">
                    <fieldset>
                        <legend>Click on individual dates to edit</legend>
                        <asp:Panel ID="Panel5" runat="server" ScrollBars="Vertical" Height="400">
                            <asp:ListView ID="PropertyAccommodationRates1" runat="server" DataSourceID="PropertyCMSRateListDs"
                                ItemPlaceholderID="itemsGoHere" OnItemDataBound="PropertyAccommodationRates1_ItemDataBound"
                                GroupItemCount="7" GroupPlaceholderID="groupsGoHere">
                                <GroupTemplate>
                                    <tr>
                                        <asp:PlaceHolder runat="server" ID="itemsGoHere" />
                                    </tr>
                                </GroupTemplate>
                                <ItemTemplate>
                                    <td>
                                        <uc1:RatesEditDate ID="RatesViewDate1" runat="server" OnEditDateRateSelected="RatesEditDate1_EditDateRateSelected"
                                            OnEditDateRateUpdated="RatesEditDate1_EditDateRateUpdated" />
                                    </td>
                                </ItemTemplate>
                                <LayoutTemplate>
                                    <table width="525px" cellspacing="2">
                                        <tr class="propertyaddedit_gridViewRates">
                                            <th class="propertyaddedit_ratesGrid">
                                                Monday
                                            </th>
                                            <th class="propertyaddedit_ratesGrid">
                                                Tuesday
                                            </th>
                                            <th class="propertyaddedit_ratesGrid">
                                                Wednesday
                                            </th>
                                            <th class="propertyaddedit_ratesGrid">
                                                Thursday
                                            </th>
                                            <th class="propertyaddedit_ratesGrid">
                                                Friday
                                            </th>
                                            <th class="propertyaddedit_ratesGrid">
                                                Saturday
                                            </th>
                                            <th class="propertyaddedit_ratesGrid">
                                                Sunday
                                            </th>
                                        </tr>
                                        <tr>
                                            <asp:PlaceHolder runat="server" ID="groupsGoHere" />
                                        </tr>
                                    </table>
                                </LayoutTemplate>
                            </asp:ListView>
                            <asp:ObjectDataSource ID="PropertyCMSRateListDs" runat="server" SelectMethod="ListPropertyCMSRates"
                                TypeName="Shared.MtaLib.Bll.PropertyRateController" OnSelecting="PropertyCMSRateListDs_Selecting">
                                <SelectParameters>
                                    <asp:Parameter Name="propertyId" Type="Int32" />
                                    <asp:Parameter Name="accommodationTypeId" Type="Int32" />
                                    <asp:Parameter Name="minDateTime" Type="DateTime" />
                                    <asp:Parameter Name="maxDateTime" Type="DateTime" />
                                    <asp:Parameter Name="fillMondays" Type="Boolean" DefaultValue="true" />
                                </SelectParameters>
                            </asp:ObjectDataSource>
                        </asp:Panel>
                    </fieldset>
                </div>
            </asp:Panel>



            <div style="clear: both;">
            </div>
            <!-- this is the usercontrol where the edit occurs -->
            <div runat="server" id="divEditRate" visible="true">
                <uc1:RatesEditDate ID="RatesEditDate1" runat="server" />
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

My user control:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="RatesEditDate.ascx.cs"
    Inherits="UserControls_RatesEditDate" %>
<asp:FormView ID="frmViewRatesDate" runat="server" Height="50px" Width="125px" OnItemCommand="frmViewRatesDate_ItemCommand"
    DataKeyNames="TheDateTime">
    <ItemTemplate>
        <asp:LinkButton ID="lnkEditDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "TheDateTime", "{0:dd/MM/yyyy}") %>'
            OnClick="lnkEditDate_Click" />
        <asp:Literal ID="Literal1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "MTABuyRateDaily", "{0:n}") %>'
            Visible='<%# DisplayMTABuy %>' />
        <asp:Literal ID="Literal2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "MTASellRateDaily", "{0:n}") %>'
            Visible='<%# DisplayMTASell %>' />
        <asp:Literal ID="Literal3" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "AffiliateNettDaily", "{0:n}") %>'
            Visible='<%# DisplayAffiliate %>' />
        <asp:Literal ID="Literal4" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "MTABuyRateWeekly", "{0:n}") %>'
            Visible='<%# DisplayWeekly %>' />
        <asp:Literal ID="Literal5" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "MTASellRateWeekly", "{0:n}") %>'
            Visible='<%# DisplayWeekly %>' />
        <asp:Literal ID="Literal6" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "AffiliateNettWeekly", "{0:n}") %>'
            Visible='<%# DisplayWeekly %>' />
        <asp:Literal ID="Literal7" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ThirtyDay", "{0:n}") %>'
            Visible='<%# DisplayThirtyDay %>' />
        <asp:Literal ID="Literal8" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Flexi", "{0:n}") %>'
            Visible='<%# DisplayFlexi %>' />
    </ItemTemplate>
    <EditItemTemplate>
        <div class="field">
            <asp:Literal ID="TheDate" runat="server" Text='<%# Bind("TheDateTime", "{0:dd/MM/yyyy}") %>' />
        </div>
        <div class="field">
            <asp:Label ID="Label1" Text="MTA buy rate" AssociatedControlID="MTABuyRate1" runat="server" /><asp:TextBox
                ID="MTABuyRate1" runat="server" Text='<%# Bind("MTABuyRateDaily", "{0:n}")%>' />
            <asp:CompareValidator ID="MTABuyRateValidator" runat="server" Type="Currency" ControlToValidate="MTABuyRate1"
                Operator="GreaterThan" ValueToCompare="0" ErrorMessage="" Display="Dynamic" ValidationGroup="EditPrice">
                <asp:Image ID="Image8" SkinID="ValidationErrorImage" runat="server" />
            </asp:CompareValidator>
            <asp:RequiredFieldValidator ID="MTABuyRateValidator2" runat="server" ControlToValidate="MTABuyRate1"
                ErrorMessage="" Display="Dynamic" ValidationGroup="EditPrice">
                <asp:Image ID="Image33" SkinID="ValidationErrorImage" runat="server" />
            </asp:RequiredFieldValidator>
        </div>
        <!-- similar items removed due to character restriction -->
        <div class="field">
            <asp:Label ID="Label6" Text="Total PAX" runat="server" AssociatedControlID="TotalPax1" />
            <asp:CompareValidator ID="TotalPaxValidator1" runat="server" ControlToValidate="TotalPax1"
                Operator="NotEqual" ValueToCompare="0" ErrorMessage="Please choose a non zero Total Pax "
                Display="Dynamic" ValidationGroup="EditPrice">
                <asp:Image ID="Image15" SkinID="ValidationErrorImage" runat="server" />
            </asp:CompareValidator>
            <asp:DropDownList ID="TotalPax1" runat="server">
                <asp:ListItem Value="0" />
                <asp:ListItem Value="1" />
                <asp:ListItem Value="2" />
                <asp:ListItem Value="3" />
                <asp:ListItem Value="4" />
                <asp:ListItem Value="5" />
                <asp:ListItem Value="6" />
                <asp:ListItem Value="7" />
                <asp:ListItem Value="8" />
                <asp:ListItem Value="9" />
                <asp:ListItem Value="10" />
            </asp:DropDownList>
        </div>
        <div class="field">
            <asp:Label runat="server" ID="Label15" AssociatedControlID="EditPriceMinStayList"
                Text="Min stay (nights)" />
            <asp:CompareValidator ID="EditPriceMinStayListValidator1" runat="server" ControlToValidate="EditPriceMinStayList"
                Operator="NotEqual" ValueToCompare="0" ErrorMessage="Please choose a non zero Min Stay"
                Display="Dynamic" ValidationGroup="EditPrice">
                <asp:Image ID="Image6" SkinID="ValidationErrorImage" runat="server" />
            </asp:CompareValidator>
            <!-- todo bind-->
            <asp:DropDownList ID="EditPriceMinStayList" runat="server">
                <asp:ListItem Value="0" />
                <asp:ListItem Value="1" />
                <asp:ListItem Value="2" />
                <asp:ListItem Value="3" />
                <asp:ListItem Value="4" />
                <asp:ListItem Value="5" />
                <asp:ListItem Value="6" />
                <asp:ListItem Value="7" />
                <asp:ListItem Value="8" />
                <asp:ListItem Value="9" />
                <asp:ListItem Value="10" />
                <asp:ListItem Value="11" />
                <asp:ListItem Value="12" />
                <asp:ListItem Value="13" />
                <asp:ListItem Value="14" />
                <asp:ListItem Value="15" />
                <asp:ListItem Value="16" />
                <asp:ListItem Value="17" />
                <asp:ListItem Value="18" />
                <asp:ListItem Value="19" />
                <asp:ListItem Value="20" />
                <asp:ListItem Value="21" />
                <asp:ListItem Value="22" />
                <asp:ListItem Value="23" />
                <asp:ListItem Value="24" />
                <asp:ListItem Value="25" />
                <asp:ListItem Value="26" />
                <asp:ListItem Value="27" />
                <asp:ListItem Value="28" />
                <asp:ListItem Value="29" />
                <asp:ListItem Value="30" />
            </asp:DropDownList>
        </div>
        <div class="field">
            <%--<asp:Button ID="btnUpdate" runat="server" Text="Update" OnClick="btnUpdate_Click" CommandName="Update" />--%>
            <asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" ValidationGroup="EditPrice" />
        </div>
        <asp:HiddenField runat="server" ID="hdnPropertyID" />
        <asp:HiddenField runat="server" ID="hdnAccommTypeID" />
    </EditItemTemplate>
</asp:FormView>
<asp:ObjectDataSource ID="PropertyCMSRateItemDs" runat="server" SelectMethod="ListPropertyCMSRate"
    TypeName="Shared.MtaLib.Bll.PropertyRateController" UpdateMethod="UpdatePropertyCMSRate"
    OldValuesParameterFormatString="original_{0}" OnUpdated="PropertyCMSRateItemDs_Updated">
    <UpdateParameters>
        <asp:Parameter Name="propertyId" Type="Int32" />
        <asp:Parameter Name="accommodationTypeId" Type="Int32" />
        <asp:Parameter Name="minStay" Type="Int32" />
        <asp:Parameter Name="TheDateTime" Type="DateTime" />
        <asp:Parameter Name="MTABuyRateDaily" Type="Decimal" />
        <asp:Parameter Name="MTASellRateDaily" Type="Decimal" />
        <asp:Parameter Name="AffiliateNettDaily" Type="Decimal" />
        <asp:Parameter Name="MTABuyRateWeekly" Type="Decimal" />
        <asp:Parameter Name="MTASellRateWeekly" Type="Decimal" />
        <asp:Parameter Name="AffiliateNettWeekly" Type="Decimal" />
        <asp:Parameter Name="ThirtyDay" Type="Decimal" />
        <asp:Parameter Name="Flexi" Type="Decimal" />
        <asp:Parameter Name="IsBreakfastIncluded" Type="Boolean" />
        <asp:Parameter Name="IsFairWarning" Type="Boolean" />
        <asp:Parameter Name="TotalPax" Type="Int32" />
        <asp:Parameter Name="original_TheDateTime" Type="DateTime" />
    </UpdateParameters>
    <SelectParameters>
        <asp:Parameter Name="propertyId" Type="Int32" DefaultValue="0" />
        <asp:Parameter Name="accommodationTypeId" Type="Int32" DefaultValue="0" />
        <asp:Parameter Name="theDateTime" Type="DateTime" />
    </SelectParameters>
</asp:ObjectDataSource>

Solution

  • I have fought with this problem for several hours and days. None of the answers I have found completely solved my problem, but I did finally find a solution.

    My scenario is as follows. I have a GridView and a FormView. These are on two views of a MultiView control. I display a list of data in the GridView. My edit button switches to the FormView because there are more fields that I want to edit than will fit in a horizontal line on the gridview (without horizontal scrolling).

    If I cancel from the edit mode of the FormView and return to the GridView (I use an OnClick event to do this), the next time a postback happens, I get a ViewState error.

    If I cancel from edit mode of the FormView and simply switch to ReadOnly mode and then cancel going back to the GridView, everything works fine.

    SOLUTION: My solution was to set the default mode of the FormView to "Edit". My theory is that if the FormView default mode is "ReadOnly", when I cancel from the Edit mode of the FormView, the next time the page loads, it tries to apply the ViewState of the Edit mode to the ReadOnly mode (the default when the page loads). By setting the default view to "Edit", the ViewState that was saved with the Edit mode is reloaded into the now new Edit mode (the default) after the page loads.

    This all happens even though the current ActiveView of the MultiView is displaying the Grid and not the Form.

    I have not had any ViewState problems since switching the default mode of the FormView to "Edit"

    Hope this helps, and I welcome any comments.

    Thanks.

    Harv Sather