2009-12-21 109 views
1

首先,我没有动态创建任何控件。这是我主动产生错误的顺序:无法加载视图状态错误

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

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

同样,我没有动态地创建任何东西,我只是隐藏在默认情况下的控制面板,然后显示他们,所以我不知道为什么我收到这个错误。

下面是一些代码:

页面加载

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中。

把一个UpdatePanel围绕整个asp.net面板解决了这个问题上面,但我仍然得到失败点击时取消或添加等加载视图状态错误...

+0

请添加一些代码请帮忙澄清问题 – Gabe 2009-12-21 17:07:31

+0

aspx/html或c#代码? – Xaisoft 2009-12-21 17:08:18

+0

aspx和html。 – jball 2009-12-21 17:15:36

回答

2

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

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

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

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); 
相关问题