【问题标题】:Getting Failed to load viewstate error无法加载视图状态错误
【发布时间】:2009-12-21 17:05:55
【问题描述】:

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

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

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

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

这里有一些代码:

页面加载

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>

这里有一些额外的信息:

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

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

在整个 asp.net 面板周围放置一个 UpdatePanel 解决了上述问题,但在单击取消或添加等时我仍然收到 Failed to load viewstate 错误...

【问题讨论】:

  • 请添加一些代码以帮助澄清问题
  • 我添加了一些c#代码,我现在将添加一些aspx/html代码。
  • aspx/html代码已添加
  • 什么是引用UpdatePanel4,如果您在页面上的任何位置而不是&lt;asp:Panel ID="pnlAlbum" runat="server" Visible="false"&gt; 标签周围插入UpdatePanel,InvalidOperationException 会消失吗?
  • UpdatePanel4 包裹在其中一个 ListBox 周围,并且它也被 UpdateProgress 引用。如果我把它放在 asp:Panel 周围,无效的操作异常就会消失,但我不知道为什么要把它放在其他任何地方。

标签: c# asp.net viewstate


【解决方案1】:

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

您的代码有点奇怪...为什么您的 EditItemTemplate 中的控件与 ItemTemplate 中的控件相同?即,Edit 按钮应该只在 ItemTemplate 中...然后 EditItemTemplate 应该有一个 Save 或 Cancel 按钮。

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

【讨论】:

  • 你建议的流程是怎么做的?
【解决方案2】:

给你的问题:

在你的 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多