无法加载viewstate错误

时间:2009-12-21 17:05:55

标签: c# asp.net viewstate

首先,我不是动态创建任何控件。这是我产生错误的顺序:

我在页面上有一个列表视图,当我点击列表视图下的编辑链接时,我会显示一个默认隐藏的面板。面板上有几个按钮以及一些列表框。当我单击列表框中的项目或单击其中一个按钮时,出现以下错误:

无法加载视图状态。正在加载视图状态的控制树必须与在上一个请求期间用于保存视图状态的控制树匹配。例如,在动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。

同样,我不是动态创建任何东西,我只是默认隐藏控件的面板,然后显示它们,所以我不知道为什么我会收到此错误。

以下是一些代码:

PAGE LOAD

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        Session["Albums"] = null;
        Albums = AlbumCollection.GetAlbums(Common.GetUserName(), 
                                                       ddlAlbumType.SelectedIndex);

        lvwAlbums.DataSource = Albums;
        lvwAlbums.DataBind();
     }
}

当我点击编辑链接时,这是运行的代码:

protected void lvwAlbums_RowEditing(object sender, ListViewEditEventArgs e)
{
    this.AlbumId = int.Parse(         
    this.lvwAlbums.DataKeys[e.NewEditIndex].Values["AlbumId"].ToString());

    this.AlbumName=
    this.lvwAlbums.DataKeys[e.NewEditIndex].Values["AlbumName"].ToString();

    Album album = new Album(this.AlbumId);

    ViewState["AlbumId"] = this.AlbumId;
    ViewState["AlbumName"] = this.AlbumName;

    pnlAlbum.Visible = true; // This panel holds the controls
    btnEditAlbum.Visible = true;
    btnCancel.Visible = true;
    EditAlbum(this.AlbumId);

        this.lvwAlbums.EditIndex = e.NewEditIndex;
        AlbumCollection.GetAlbums(Common.GetUserName(),ddlAlbumType.SelectedIndex);
    }

如果我点击取消按钮,我会收到错误,但如果点击面板上的其他按钮,例如添加/删除,也会发生这种情况......以下是取消按钮的代码:

pnlAlbum.Visible = false;
this.lvwAlbums.EditIndex = -1;
AlbumCollection.GetAlbums(Common.GetUserName(), ddlAlbumType.SelectedIndex);

这是ListView的aspx / html:

<asp:ListView ID="lvwAlbums" 
              runat="server" 
              GroupItemCount="5" 
              DataKeyNames="AlbumId,AlbumName"
              OnItemEditing="lvwAlbums_RowEditing" 
              OnItemCommand="lvwAlbums_ItemCommand"
              OnItemDeleting="lvwAlbums_RowDeleting"  
              OnSelectedIndexChanging="lvwAlbums_SelectedIndexChanging"
              OnPagePropertiesChanging="lvwAlbums_PagePropertiesChanging">
 <EditItemTemplate>
 <td>
 <div>
 <asp:TextBox ID="txtAlbumName" runat="server"
              Text='<%# Eval("AlbumName").ToString().Trim() %>' />

 <asp:LinkButton ID="lnkView" runat="server" Text="View" CommandName="View"
                 CommandArgument='<%# Eval("AlbumId") %>'>
 </asp:LinkButton>
 |
 <asp:LinkButton ID="lnkEdit" runat="server" Text="Edit" CommandName="Edit"
                 CommandArgument='<%# Eval("AlbumId") %>'>
 </asp:LinkButton>
 |
 <asp:LinkButton ID="lnkDelete" runat="server" Text="Delete" CommandName="Delete"
                 CommandArgument='<%# Eval("AlbumId") %>'>
 </asp:LinkButton>
 <br />
 <span>Songs:
 <%# Eval("total") %></span>
 </div>
 </td>
 </EditItemTemplate>
 <LayoutTemplate>
 <asp:DataPager runat="server" ID="ItemDataPager" PageSize="20" 
                PagedControlID="lvwAlbums">
 <Fields>
 <asp:NumericPagerField ButtonType="Link" NumericButtonCssClass="pager" />
 </Fields>
 </asp:DataPager>
 <table>
 <tr>
 <td>
 <table>
 <asp:PlaceHolder runat="server" ID="groupPlaceHolder"></asp:PlaceHolder>
 </table>
 </td>
 </tr>
 </table>
 </LayoutTemplate>
 <GroupTemplate>
 <tr>
 <asp:PlaceHolder runat="server" ID="itemPlaceHolder"></asp:PlaceHolder>
 </tr>
 </GroupTemplate>
 <ItemTemplate>
 <td>
 <asp:Literal ID="litAlbumName" runat="server" 
              Text='<%#  Eval("AlbumName").ToString().Trim() %>' />
 <br />
 <asp:LinkButton ID="lnkView" runat="server" Text="View" CommandName="View"
                 CommandArgument='<%# Eval("AlbumId") %>'>
 </asp:LinkButton>
 |
 <asp:LinkButton ID="lnkEdit" runat="server" Text="Edit" CommandName="Edit"
                 CommandArgument='<%# Eval("AlbumId") %>'>
 </asp:LinkButton>
 |
 <asp:LinkButton ID="lnkDelete" runat="server" Text="Delete" CommandName="Delete"
                 CommandArgument='<%# Eval("AlbumId") %>'>
 </asp:LinkButton>
 <br />
 <span>Songs:
 <%# Eval("total") %></span>
 </td>
 </ItemTemplate>
 </asp:ListView>

以下是小组的标记:

<asp:Panel ID="pnlAlbum" runat="server" Visible="false">
<asp:ListBox ID="lstAvailableSongs" runat="server" SelectionMode="Multiple">   
</asp:ListBox>
<asp:Button ID="btnAddAll" runat="server" Text="Add All" OnClick="btnAddAll_Click" />
<asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
<asp:Button ID="btnRemove" runat="server" Text="Remove" OnClick="btnRemove_Click" />
<asp:Button ID="btnRemoveAll" runat="server" 
            Text="Remove All"OnClick="btnRemoveAll_Click" />
<asp:ListBox ID="lstSelectedSongs" runat="server" SelectionMode="Multiple">  
</asp:ListBox>
<asp:Button ID="btnCancel" runat="server" Text="Cancel" OnClick="btnCancel_Click" />
<asp:Button ID="btnEditAlbum" runat="server"Text="Save"
            ValidationGroup="CreateAlbum" OnClick="btnEditAlbum_Click" />
<asp:Button ID="btnSaveAs" runat="server" Text="Save As" ValidationGroup="CreateAlbum"
            OnClick="btnSaveAs_Click" />
</asp:Panel>

以下是一些额外信息:

我在面板中的一个列表框周围放置了一个更新面板,当我点击listview项目下的编辑链接时,我收到以下错误:

Microsoft JScript运行时错误:Sys.InvalidOperationException:找不到ID为“ctl00_ctl00_InnerContent_MainContent_UpdatePanel4”的UpdatePanel。如果它是动态更新的,那么它必须在另一个UpdatePanel内。

在整个asp.net面板上放置一个UpdatePanel解决了上面的问题,但是当我点击取消或添加等时仍然无法加载viewstate错误...

2 个答案:

答案 0 :(得分:2)

首先,您可能需要在设置EditIndex后重新绑定ListView。 (说实话,我根本没有使用过ListView,但这是其他转发器控件的工作原理)“EditAlbum()”有什么作用?

您的代码有点奇怪...为什么EditItemTemplate中的控件与ItemTemplate中的控件相同?即,编辑按钮应该只在ItemTemplate中...然后EditItemTemplate应该有一个保存或取消按钮。

底线...您的控制树在LoadViewState上与调用SaveViewState时的控制树不同。您可以做的一件事是覆盖这些方法,然后在那里放置一个断点来手动查看调试器中的Controls集合。您可能会看到ListView中的控件不同。但在你这样做之前先尝试我的第一个建议。

答案 1 :(得分:0)

问题:

你的Page_Load

Albums = AlbumCollection.GetAlbums(Common.GetUserName(), ddlAlbumType.SelectedIndex);

但在lvwAlbums_RowEditing(..)btnCancel_Click(...)中有

AlbumCollection.GetAlbums(Common.GetUserName(), ddlAlbumType.SelectedIndex);

不应该是(专辑= ...)

Albums = AlbumCollection.GetAlbums(Common.GetUserName(), ddlAlbumType.SelectedIndex);