(功能是:使用session在用户控件页面缓存接口数据,使得翻页的时候不用反复调用接口;)//包含用户控件页面的页面: ProcessInfo.aspx
    public partial class ProcessInfo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            PlaceHolder1.Controls.Add(LoadControl("BusinessConfig.ascx"));           
            PlaceHolder2.Controls.Add(LoadControl("DatabaseConfig.ascx"));
        }
     ......
    }
//用户控件页面: BusinessConfig.ascx
   public partial class BusinessConfig : System.Web.UI.UserControl
    {
        protected static int ItemCount = 0;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
               GetLvInfo();
            }
            else
            {
            }
        }
        protected void GetLvInfo()
        {
            List<A> a= new List<A>(GetInfo());
            Session["A"] = a;                  //1
            ItemCount = a.Count;
        }
         public int CountAll()
        {
            return ItemCount;
        }
        public List<A> BindLv(int startIndex, int maxRows)
        {            
            return BaseDAL<A>.LoadOnePage(Session["A"], startIndex, maxRows);  //2
        }
    }//DataSource代码
<asp:ObjectDataSource ID="ObjDsBusiMonitor" runat="server" SelectMethod="BindLv"
TypeName="SynthesisTraffic.UI.Pages.ProcessManager.BusinessConfig" DataObjectTypeName="SynthesisTraffic.ProcessManager_Ref.ProcessUnit"
EnablePaging="True" MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex"
SelectCountMethod="CountAll"></asp:ObjectDataSource>
加载ProcessInfo.aspx执行顺序:
1.ProcessInfo.aspx的Page_load;
2.BusinessConfig.ascx的page_load; //此时1处Session["A"]获取值
3.DatabaseConfig.ascx的Page)load;然后我再点击进入到BusinessConfig.ascx页面,执行顺序:
1.BusinessConfig.ascx的page_load的else部分;
2.调用ListView数据源的方法:BindLv,此时会报错,因为2处的Session["A"]为null现在的问题是:2处的Seesion["A"]为什么会为null?
各位大侠帮帮忙,试了很多种,比如把Session更换为全局变量、在用户页面ProcessInfo.aspx先获取Seesion然后再在控件页面获取该session、或者给用户控件添加属性,在ProcessInfo.aspx页面给该属性赋值,2处的效果均为null;主要是很不明白为什么Session会消失了请不吝赐教,小女子将非常感谢!

解决方案 »

  1.   

    <sessionState timeout="30"></sessionState>
    <httpRuntime executionTimeout="100" maxRequestLength="409600" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true"/>
      

  2.   

    估计问题不是session失效的原因,因为如最开始所述,不使用session,也是到2这个位置,就只能获取到null值了
      

  3.   

    初步原因找到了,不是因为Session丢失了,而是DataSource绑定的问题:
    修改如下:<asp:ObjectDataSource ID="ObjDs" runat="server" SelectMethod="BindLv"                    TypeName="SynthesisTraffic.UI.Pages.ProcessManager.BusinessConfig" DataObjectTypeName="SynthesisTraffic.ProcessManager_Ref.A"
    EnablePaging="True" MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex"
    SelectCountMethod="CountAll">
       <SelectParameters>
           <asp:SessionParameter Name="obj" SessionField="AInfo" Type="Object" />
       </SelectParameters>
    </asp:ObjectDataSource> <asp:DataPager ID="DataPager1" runat="server" PagedControlID="lvBusiMonitor" PageSize="5">
      <Fields>
          <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
          <asp:NumericPagerField NumericButtonCssClass="shoutoutallnumericpager" ButtonType="Button" NextPageText=">>" PreviousPageText="<<" ButtonCount="5" />
          <asp:NextPreviousPagerField ButtonType="Button" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" />
      </Fields>
    </asp:DataPager>对应的SelectMethod:”BindLv“修改为:        /// <summary>
            /// 
            /// </summary>
            /// <param name="obj">数据项</param>
            /// <param name="startIndex">第几页</param>
            /// <param name="maxRows">每页行数</param>
            /// <returns></returns>
            public List<A> BindLv(object obj, int startIndex, int maxRows)
            {
                return BaseDAL<A>.LoadOnePage(obj, startIndex, maxRows);
            }       
            public int CountAll() 
            {
                return ItemCount;
            }等于把Seesion当做参数传给了BindLv,这样就可以正确获取该值了!但是又有了新的问题:
    大家注意看,这样的objSrc绑定方式其实不太常见的,我是在网上看见的,它的startIndex,maxRows都是直接获取的DataPager的值,DataPager没什么特别设置。现在出现的新错误是:
    “ObjectDataSource“ObjDsBusiMonitor”未能找到带参数的非泛型方法“CountAll”: obj。 ”
    请问这是为什么呢?