从Objectdatasource上的FetchCount()访问时,Hiddenfield为null

时间:2011-10-13 08:13:44

标签: c# asp.net subsonic objectdatasource

我正在使用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
    }

我做错了什么?

我的解决方案

我使用了会话

1 个答案:

答案 0 :(得分:0)

那是因为您尝试将SearchResults用作Page和支持ObjectDataSource的基础类。

正如documentation中所述,由于您的数据对象方法不是staticObjectDataSource将创建SearchResults实例} class并调用该实例上的方法。这意味着隐藏字段将始终为null,视图状态内容将毫无意义。

您可以将记录计数保留在ASP.NET会话状态中,您可以从当前的HTTP上下文访问该记录计数:

public int? TotalRecords
{
    get {
        return (int?) HttpContext.Current.Session["TotalRecords"];
    }
    set {
        HttpContext.Current.Session["TotalRecords"] = value;
    }
}