2009-12-21 107 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); 
相關問題