참고 :이 예제는 더 간단한 예제가 있으므로 완전히 수정되었습니다.ListView + ObjectDataSource SelectMethod는 EnableViewState = "false"인 경우 두 번 호출됩니다.
ListView
및 ObjectDataSource
만있는 샘플 페이지를 설정했습니다. 처음으로 페이지가 나타나면 (!IsPostBack
) 내 GetList
메서드가 한 번 호출됩니다. 페이징 (IsPostBack
) 후에는 GetList
메서드가 두 번 호출됩니다. 이전의 페이징 값에서는 처음으로, 새 값에서는 두 번째로 호출됩니다.
ListView
에 EnableViewState="true"
을 설정하면 GetList
메서드는 한 번만 호출됩니다. ListView
은 ViewState
에서 가져 오거나 메소드를 다시 실행하여 "초기 상태"를 원합니다.
ListView
에서 ViewState를 사용 중지하고 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; }
}
}
내가 캐싱 생각을하지만, 내 경우 (10 초 길어야 말)가 무한 매개 변수 가능성, 그래서 캐시의 지속 시간이 매우 작은 수 할 것입니다. 사용자가 10 초 후에 페이지를 열면 여전히 쿼리가 두 배가되어 페이지가 상당히 느려집니다. ViewState를 사용하면 더 나은 옵션이됩니다. ListView에서 DataPager를 옮기지 못해도 여전히 두 번 쿼리되었습니다. 나는 직접적으로 또는 간접적으로 (Reflection을 통해)'BaseDataBoundControl.RequiresDataBinding'을 설정할 수 있는지 궁금합니다. –
Reflection을 통해'RequiresDataBinding'을 false로 설정하려고 시도하여 이중 쿼리를 방지합니다. 그러나 그것은 발생하는 첫 번째 쿼리 (페이징 전) 일 뿐이므로 사용할 수 없습니다. 이제 ViewState를 떠날 것입니다. –
매개 변수에 대해 생각하지 않았습니다. 캐시가 어떻게 구현되는지는 잘 모르겠습니다. 그러나,리스트 뷰에서 페이저를 움직이면 나에게 트릭이 생겼다. 나는 그것이 믿을만한 해결책이 아니라고 생각한다. RequiresDataBinding은 여러 위치에서 재정의됩니다. 시간이 허락한다면 ListView에서 자신의 컨트롤을 만들고 CreateChildren과 RequiresDataBinding을 처리 할 수 있습니다. 그렇다면 항상 ViewState가 있습니다. :) – Ruslan