在C#web表单中单击[OK]后,如何在.aspx页面之间传递变量

在C#web表单中单击[OK]后,如何在.aspx页面之间传递变量,c#,webforms,session-state,C#,Webforms,Session State,我不熟悉网络表单 1) 我的默认web表单是default.aspx。它有两个组合框和一个按钮控件:所有ASP.NETWeb控件 2) 在页面u load()中,我创建了一个C对象“ScoringInfo()”: 受保护的无效页面加载(对象发送方、事件参数e) { scoringInfo=新的scoringInfo(); ... 3) ScoringInfo将数据库中的一些信息读取到成员变量中,并使用成员变量填充组合框: scoringInfo.GetOpenCrossByDate(dt, op

我不熟悉网络表单

1) 我的默认web表单是default.aspx。它有两个组合框和一个按钮控件:所有ASP.NETWeb控件

2) 在页面u load()中,我创建了一个C对象“ScoringInfo()”:

受保护的无效页面加载(对象发送方、事件参数e) { scoringInfo=新的scoringInfo(); ... 3) ScoringInfo将数据库中的一些信息读取到成员变量中,并使用成员变量填充组合框:

scoringInfo.GetOpenCrossByDate(dt, openCrossInfo); cbAvailableBowlers.Items.Clear (); foreach (OpenCrossInfoRec rec in openCrossInfo) string s = String.Format( "Lane {0:00}: {1}", rec.laneNo, rec.dateTime); cbAvailableBowlers.Items.Add(s); ... scoringInfo.GetOpenCrossByDate(dt,openCrossInfo); cbAvailableBowlers.Items.Clear(); foreach(openCrossInfo中的OpenCrossInfoRec) 串= 字符串格式( “车道{0:00}:{1}”, 记录laneNo,记录dateTime); cbAvailableBowlers.Items.Add; ... 4) 以下是成员变量:

... protected ScoringInfo scoringInfo; protected List leagueInfo = new List(); protected List openCrossInfo = new List(); ... 受保护的ScoringInfo ScoringInfo; 受保护列表leagueInfo=新列表(); 受保护列表openCrossInfo=新列表(); 5) 当用户按下按钮时,我想显示第二个.aspx页面,该页面处理用户选择的特定组合框项。下面是我的“OnClick”事件处理程序:

protected void bTest_Click1(object sender, EventArgs e) { int idx = cbAvailableBowlers.SelectedIndex; Session["openCrossLaneUniqueId"] = openCrossInfo[idx].laneUniqueId; ...// THIS FAILS: // "ARGUMENT OUT OF RANGE" exception; // "idx" is 0; openCrossInfo[] list is empty... 受保护的无效B测试点击1(对象发送者,事件参数e) { int idx=cbAvailableBowlers.SelectedIndex; 会话[“openCrossLaneUniqueId”]=openCrossInfo[idx].laneUniqueId; …//此操作失败: //“参数超出范围”例外; //“idx”为0;openCrossInfo[]列表为空。。。 它不起作用…因为成员变量“openCrossInfo[]”和组合框属性SelectedIndex在执行bTest_Click1时似乎不再有效


如何/在何处保存同一会话中其他后续页面的UI状态?

页面的成员变量(如openCrossInfo)不会在请求之间持续。每次新请求传入时,都会再次创建.aspx的页面对象。因此,当bTest_Click事件触发时,它正在处理页面对象的新副本。您的openCrossInfo数组没有值,因为页面对象刚刚创建,即使您在以前的请求中设置了它。


如果要保存状态,则必须使用其他内容,如会话状态。

正如Jay Douglass指出的那样,问题在于原始页面中的成员变量“openCrossInfo”没有持久化到新的“回发”页面

解决办法是:

  • 在原始页面(“if!IsPostBack”)中创建并初始化对象,将初始化的对象保存到会话中,然后
  • 将它们从会话还原到下一页:

  • 受保护的无效页面加载(对象发送方,事件参数e)
    {
    scoringInfo=新的scoringInfo();
    如果(!IsPostBack)
    {
    //第一次,使用当前日期/时间;创建新数据
    leagueInfo=新列表();
    openCrossInfo=新列表();
    laneUniqueIds=新列表();
    updateGui(DateTime.Now);
    会话[“leagueInfo”]=leagueInfo;
    会话[“openCrossInfo”]=openCrossInfo;
    会话[“laneUniqueIds”]=laneUniqueIds;
    }
    其他的
    {
    //后续回调:检索状态
    leagueInfo=(列表)会话[“leagueInfo”];
    openCrossInfo=(列表)会话[“openCrossInfo”];
    laneUniqueIds=(列表)会话[“laneUniqueIds”];
    }
    }
    
    protected void bTest_Click1(object sender, EventArgs e) { int idx = cbAvailableBowlers.SelectedIndex; Session["openCrossLaneUniqueId"] = openCrossInfo[idx].laneUniqueId; ...// THIS FAILS: // "ARGUMENT OUT OF RANGE" exception; // "idx" is 0; openCrossInfo[] list is empty...
    protected void Page_Load(object sender, EventArgs e)
    {
        scoringInfo = new ScoringInfo();
        if (!IsPostBack)
        {
            // 1st time, use current date/time; create new data
            leagueInfo = new List<LeagueInfoRec>();
            openCrossInfo = new List<OpenCrossInfoRec>();
            laneUniqueIds = new List<string>();
            updateGui(DateTime.Now);
            Session["leagueInfo"] = leagueInfo;
            Session["openCrossInfo"] = openCrossInfo;
            Session["laneUniqueIds"] = laneUniqueIds;
        }
        else
        {
            // Subsequent callbacks: retrieve state
            leagueInfo = (List<LeagueInfoRec>)Session["leagueInfo"];
            openCrossInfo = (List<OpenCrossInfoRec>)Session["openCrossInfo"];
            laneUniqueIds = (List<string>)Session["laneUniqueIds"];
        }
    }