Проблема: не удалось загрузить viewstate - PullRequest
2 голосов
/ 31 мая 2009

Я делаю веб-сайт для моего проекта колледжа. Проект - это веб-сайт, который получает все от веб-сервиса. Может кто-нибудь сказать, что происходит, и как я могу это исправить?

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

Failed to load viewstate.  The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.

Моя страница продуктов я тихо просто:

<asp:ListView ID="lv_ProductList" runat="server" DataKeyNames="product_id">
        <LayoutTemplate>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
            <br />
            <br />
            <asp:DataPager ID="pageTopics" runat="server" PageSize="8" PagedControlID="lv_ProductList" >
                <Fields>
                    <asp:NextPreviousPagerField ShowFirstPageButton="false" ShowPreviousPageButton="true" ShowNextPageButton="false" ButtonCssClass="span" />
                    <asp:NumericPagerField />
                    <asp:NextPreviousPagerField ShowFirstPageButton="false" ShowPreviousPageButton="false" ShowNextPageButton="true" ShowLastPageButton="false" />
                </Fields>
           </asp:DataPager>
        </LayoutTemplate>
        <ItemTemplate>
            <div class="item">
                <img src="images/pic_1.jpg" width="91" height="105" alt="iPod" class="left" />
                <h3><a href="http://www.justwebtemplates.com"><%# Eval("product_name") %></a></h3>
                <p><%# Eval("product_desc").ToString().Substring(0,90) + "..." %> </p>
                <div><a href="http://www.freewebsitetemplates.com" class="details">details</a> <a href="http://www.freewebsitetemplates.com" class="addtocart">add to cart</a></div>
                <div class="divider"></div>
            </div>
        </ItemTemplate>
        <EmptyDataTemplate>No products found</EmptyDataTemplate>
        <EmptyItemTemplate>No products found</EmptyItemTemplate>
    </asp:ListView> 

И в коде позади:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            getProductsList();
        }
    }


    public void getProductsList()
    {
        Store.Service myProducts = new Store.Service();
        var products = myProducts.getProductList();

        lv_ProductList.DataSource = products;
        lv_ProductList.DataBind();
    }

и в веб-сервисе:

[WebMethod]
    public List<ws_product> getProductList()
    {
        using (DataClassesDataContext myProducts = new DataClassesDataContext())
        {

            var productList = from p in myProducts.ws_products
                              select p;

            return productList.ToList();
        }

}

Может кто-нибудь сказать, что происходит? Также, если я вывожу Пейджер за пределы ListView, я не получаю сообщение об ошибке, однако, если я нажму на ссылку на следующую страницу, он отобразит тот же набор данных.

Как мне это исправить? Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 13 января 2010

В коде добавьте:

protected void lds_Selecting(object sender, LinqDataSourceSelectEventArgs args)
{
        Store.Service myProducts = new Store.Service();  
        args.Result  = myProducts.getProductList();     
}

Добавить asp: LinqDataSource на страницу:

  <asp:LinqDataSource ID="lds" runat="server" OnSelecting="lds_Selecting" />


    <asp:ListView ID="lv_ProductList" runat="server" 
DataKeyNames="product_id"   DataSourceID="lds">   
            <LayoutTemplate>   
                <asp:PlaceHolder ID="itemPlaceholder" runat="server" />   
                <br />   
                <br />   
                <asp:DataPager ID="pageTopics" runat="server" PageSize="8" PagedControlID="lv_ProductList" >   
                    <Fields>   
                        <asp:NextPreviousPagerField ShowFirstPageButton="false" ShowPreviousPageButton="true" ShowNextPageButton="false" ButtonCssClass="span" />   
                        <asp:NumericPagerField />   
                        <asp:NextPreviousPagerField ShowFirstPageButton="false" ShowPreviousPageButton="false" ShowNextPageButton="true" ShowLastPageButton="false" />   
                    </Fields>   
               </asp:DataPager>   
            </LayoutTemplate>   
            <ItemTemplate>   
                <div class="item">   
                    <img src="images/pic_1.jpg" width="91" height="105" alt="iPod" class="left" />   
                    <h3><a href="http://www.justwebtemplates.com"><%# Eval("product_name") %></a></h3>   
                    <p><%# Eval("product_desc").ToString().Substring(0,90) + "..." %> </p>   
                    <div><a href="http://www.freewebsitetemplates.com" class="details">details</a> <a href="http://www.freewebsitetemplates.com" class="addtocart">add to cart</a></div>   
                    <div class="divider"></div>   
                </div>   
            </ItemTemplate>   
            <EmptyDataTemplate>No products found</EmptyDataTemplate>   
            <EmptyItemTemplate>No products found</EmptyItemTemplate>   
        </asp:ListView> 

это должно работать.

2 голосов
/ 31 мая 2009

Это не совсем моя область знаний, но я могу дать некоторые концептуальные рекомендации.

Хотя вы разместили на своей странице элемент управления пейджером, вы не реализовали пейджинг в своем коде или в своей службе.

Ваша служба должна будет принимать параметры индекса и длины, поэтому браузер может сказать: «Я сейчас нахожусь на пункте 20, и я смотрю на 10 за раз, так что теперь перейдите к БД и отправьте обратно элементы 30-39. "

Ваш сервис должен поддерживать пейджинг. В качестве альтернативы, вы можете загрузить все элементы на страницу один раз и использовать jQuery-подобную библиотеку для выполнения «виртуальной» подкачки страниц вместо обратной отправки, но я думаю, что это выходит за рамки вашего школьного проекта.

0 голосов
/ 31 мая 2009

Джей, спасибо за попытку помочь.

После того, как я некоторое время ломал голову о стену, в итоге я создал собственный пейджер для моего ListView. Теперь все работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...