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" /> <asp:Label
ID="lblAccom" runat="server" Text="" /></li>
<li>
<asp:Label ID="Label101" runat="server" Text="Local Label" AssociatedControlID="lblLocalLabel" /> <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>