2009-05-31 5 views
2

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

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

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

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

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

ответ

3

На вашем коде позади добавить:

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

Добавить жерех: 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 за раз, поэтому теперь перейдите в базу данных и отправьте обратно пункты 30-39 ".

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

0

Jay, спасибо, что постарался помочь.

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

Смежные вопросы