我正在使用subsonic和gridview with objectdatasource(之前我没有使用过objectdatasource)
网格绑定得很好,我唯一的问题是我不想继续调用数据库来获取表中所有记录的计数。因此,当我第一次将它存储在hiddenfield(或viewstate)中时,我会调用“FetchCount”(SelectCountMethod)。出于某种原因,当我尝试访问它时,我的隐藏字段始终为null,而不是值,即实际的隐藏字段。如果我尝试将其存储在视图状态中,也会出现这种情况。
这是我的aspx。只是一个gridview,ObjectDatasource和一个隐藏字段
<asp:GridView ID="grdResults" runat="server" AllowPaging="True" AutoGenerateColumns="false"
DataSourceID="PropertiesDataSource" PageSize="10" >
<Columns >
<asp:BoundField DataField="PropertyName" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="PropertiesDataSource" runat="server" SelectMethod="FetchPagedData"
TypeName="TestWebsite.Usercontrols.Search.SearchResults" SelectCountMethod="FetchCount"
StartRowIndexParameterName="start"
MaximumRowsParameterName="pageLength" EnablePaging="True" />
<asp:HiddenField ID="hdnTotalRecords" runat="server" />
TypeName =“TestWebsite.Usercontrols.Search.SearchResults”是上述控件所在的网页的命名空间。
public int? TotalRecords
{
get
{
if (hdnTotalRecords.Value != string.Empty) return int.Parse(hdnTotalRecords.Value);
else return null;
}
set { hdnTotalRecords.Value = value.ToString(); }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
grdResults.DataBind();
}
[DataObjectMethod(DataObjectMethodType.Select, false)]
public PropertyXCollection FetchPagedData(int start, int pageLength)
{
int startIndex;
if (start == 0)
startIndex = 1;
else
startIndex = start / pageLength + 1;
PropertyXCollection collection = GetProperties(startIndex, 10);
return collection;
}
public int FetchCount()
{
int returnVal = 0;
if (TotalRecords != null)
returnVal = (int)TotalRecords;
else
{
TotalRecords = GetProperties(null, null).Count;
returnVal = (int)TotalRecords;
}
return (int)returnVal;
}
PropertyXCollection GetProperties(int? pageIndex, int? pageCount)
{
//method that uses subsonic to return a collection of Properties from the database //and passes in the page index and count
}
我做错了什么?
我的解决方案
我使用了会话
答案 0 :(得分:0)
那是因为您尝试将SearchResults
用作Page
和支持ObjectDataSource
的基础类。
正如documentation中所述,由于您的数据对象方法不是static
,ObjectDataSource
将创建SearchResults
的新实例} class并调用该实例上的方法。这意味着隐藏字段将始终为null
,视图状态内容将毫无意义。
您可以将记录计数保留在ASP.NET会话状态中,您可以从当前的HTTP上下文访问该记录计数:
public int? TotalRecords
{
get {
return (int?) HttpContext.Current.Session["TotalRecords"];
}
set {
HttpContext.Current.Session["TotalRecords"] = value;
}
}