Проблема: не удалось загрузить viewstate

2

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

На одной из моих страниц у меня есть элемент управления 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.

Страница моих продуктов я quiet simple:

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

}

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

Как это исправить? Заранее благодарю вас.

Теги:
linq
web-services

3 ответа

3
Лучший ответ

В вашем коде за добавлением:

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

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

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

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню