Не удалось загрузить ошибку viewstate - PullRequest
1 голос
/ 21 декабря 2009

Во-первых, я не создаю динамически никаких элементов управления. Это порядок, который я беру, чтобы произвести ошибку:

У меня есть список на странице, когда я нажимаю ссылку редактирования под списком, я отображаю панель, которая по умолчанию скрыта. На панели есть несколько кнопок и несколько списков. Когда я щелкаю элемент в списке или нажимаю одну из кнопок, я получаю следующую ошибку:

Не удалось загрузить viewstate. Дерево управления, в которое загружается состояние просмотра, должно соответствовать дереву управления, которое использовалось для сохранения состояния просмотра во время предыдущего запроса. Например, при динамическом добавлении элементов управления элементы управления, добавленные во время обратной передачи, должны соответствовать типу и положению элементов управления, добавленных во время первоначального запроса.

Опять же, я ничего не создаю динамически, я просто скрываю панель с элементами управления по умолчанию и затем отображаю их, поэтому я не уверен, почему я получаю эту ошибку.

Вот код:

НАГРУЗКА СТРАНИЦЫ

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);

Вот aspx / html для ListView:

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

Вот разметка для Panel:

<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: Не удалось найти UpdatePanel с идентификатором «ctl00_ctl00_InnerContent_MainContent_UpdatePanel4». Если он обновляется динамически, то он должен быть внутри другой UpdatePanel.

Размещение UpdatePanel вокруг всей панели asp.net решило проблему, описанную выше, но я все еще получаю ошибку Failed to load viewstate при нажатии на Cancel или Add и т. Д ...

Ответы [ 2 ]

2 голосов
/ 22 декабря 2009

Во-первых, вам, вероятно, нужно перепривязать ListView после установки EditIndex. (честно говоря, я вообще не использовал ListView, но именно так работают другие элементы управления репитером) Что делает «EditAlbum ()»?

Ваш код немного странный ... почему у вас в EditItemTemplate те же элементы управления, что и в ItemTemplate? То есть кнопка «Правка» должна быть только в ItemTemplate ... Тогда у EditItemTemplate должна быть кнопка «Сохранить» или «Отмена».

Итог ... ваше дерево элементов управления на LoadViewState отличается от того, которое было при вызове SaveViewState. Одна вещь, которую вы можете сделать, это переопределить эти методы и затем поставить точку останова, чтобы вручную просмотреть коллекцию Controls в отладчике. Вы, вероятно, увидите, что элементы управления внутри ListView отличаются. Но попробуй мое первое предложение, прежде чем сделать это.

0 голосов
/ 22 декабря 2009

Вопрос к вам:

в вашей Page_Load у вас есть

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

но в lvwAlbums_RowEditing(..) и в btnCancel_Click(...) у вас есть

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

это не должно быть ( Albums = ...)

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