ListView + ObjectDataSource SelectMethod вызывается дважды, когда EnableViewState = "false" - PullRequest
2 голосов
/ 30 ноября 2010

Примечание: Этот вопрос был полностью изменен, теперь у меня есть более простой пример.

Я настроил образец страницы, который имеет только ListView и ObjectDataSource.При первом открытии страницы (!IsPostBack) мой метод GetList вызывается один раз.После подкачки (IsPostBack) метод GetList вызывается дважды - первый раз со старыми значениями подкачки и второй раз с новыми значениями.

Если я установил EnableViewState="true" на ListView, то метод GetList вызывается только один раз.Мне кажется, что ListView хочет «начальное состояние», которое он получает либо из ViewState, либо путем повторного запуска метода.

Есть ли способ отключить ViewState на ListViewа также предотвратить повторный вызов SelectMethod?

Страница ASPX:

    <asp:ListView ID="TestListView" runat="server" DataSourceID="ODS" EnableViewState="false">
        <LayoutTemplate>
            <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />

            <asp:DataPager ID="TestPager" runat="server" PageSize="10">
                <Fields>
                    <asp:NumericPagerField />
                </Fields>
            </asp:DataPager>
        </LayoutTemplate>
        <ItemTemplate>
            <div><%# Eval("Title") %></div>
        </ItemTemplate>
    </asp:ListView>

    <asp:ObjectDataSource ID="ODS" runat="server" SelectMethod="GetList" SelectCountMethod="GetListCount"
        TypeName="Website.Test" EnablePaging="true" />

Код ASPX позади:

namespace Website
{
    public partial class Test : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        public IList<DataItem> GetList(int maximumRows, int startRowIndex)
        {
            return GetListEnumerable().Skip(startRowIndex).Take(maximumRows).ToList();
        }

        public IEnumerable<DataItem> GetListEnumerable()
        {
            for (int i = 0; i < 100; i++)
            {
                yield return new DataItem { Title = i.ToString() };
            }
        }

        public int GetListCount()
        {
            return 100;
        }
    }

    public class DataItem
    {
        public string Title { get; set; }
    }
}

Ответы [ 3 ]

2 голосов
/ 01 декабря 2010

Либо включить кэширование ODS.

<asp:ObjectDataSource ID="ODS" ... EnableCaching="true" />

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

Или переместите ваш DataPager из ListView и установите свойство PagedControlID.

0 голосов
/ 16 декабря 2010

У меня была похожая проблема, когда она работала по-разному в зависимости от браузера.IE в одну сторону, а все остальные браузеры - в одну сторону. Может быть, проблема не такая, как у вас.

Я решил ее так:

0 голосов
/ 02 декабря 2010

На самом деле вы должны использовать событие OnSelecting.

В результате ObjectDataSource вызывает метод SelectMethod дважды

  1. В первый раз он получает данные.
  2. В следующий раз он получит счет.

Так что я думаю, что вы должны реализовать событие OnSelecting

<asp:ObjectDataSource ID="ODS" runat="server" SelectMethod="GetList" SelectCountMethod="GetListCount" 
    OnSelecting="ods_Selecting">
    TypeName="Website.Test" EnablePaging="true" /> 

и затем отмените событие, когда ObjectDataSource пытается вызвать метод count.

 protected void ods_Selecting(object sender,
                ObjectDataSourceSelectingEventArgs e)
 {
      if (e.ExecutingSelectCount)
      {
           //Cancel the event   
           return;
      }
}

Вы можете посмотреть полную реализацию, как указано в ссылке ниже http://www.unboxedsolutions.com/sean/archive/2005/12/28/818.aspx

Надеюсь, это поможет.

...