Как передать переменную между страницами .aspx после нажатия [OK] в веб-форме C # - PullRequest
1 голос
/ 27 июня 2011

Я новичок в веб-формах ...

1) Моя веб-форма по умолчанию - Default.aspx.Он имеет несколько полей со списком и элемент управления Button: все веб-элементы управления ASP.Net.

2) В Page_load () я создаю объект C # "ScoringInfo ()":

    protected void Page_Load(object sender, EventArgs e)
    {
        scoringInfo = new 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);
      ...

4) Вот переменные-члены:

  ...
  protected ScoringInfo scoringInfo;
  protected List leagueInfo = new List();
  protected List openCrossInfo = new List();

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...

Это не работает ... потому что переменная-член "openCrossInfo []" и свойство комбинированного окна SelectedIndex, похоже, больше не действуют, когдаbTest_Click1 выполняется!

В: Как / где я могу сохранить состояние интерфейса для других, последующих страниц в том же сеансе ???

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 27 июня 2011

Переменные-члены для страницы (такие как openCrossInfo) не будут сохраняться от запроса к запросу. Объект Page для .aspx создается снова каждый раз, когда поступает новый запрос. Поэтому, когда возникает событие для bTest_Click, он работает с новой копией объекта Page. В вашем массиве openCroseInfo нет значений, поскольку объект страницы был только что создан, даже если вы установили его в более раннем запросе.

Если вы хотите сохранить состояние, вам придется использовать что-то еще, например, состояние сеанса.

2 голосов
/ 27 июня 2011

Вот пять способов передачи данных между веб-страницами:

http://www.itorian.com/2012/07/5-ways-to-send-data-between-aspnet-pages.html

0 голосов
/ 27 июня 2011

Проблема, как отметил Джей Дуглас, заключается в том, что переменная-член "openCrossInfo" с исходной страницы не сохраняется на новой странице "обратной передачи".

Решение было в следующем: а) создатьи инициализировать объекты на исходной странице («if! IsPostBack»), сохранить инициализированные объекты в сеансе, а затем b) восстановить их из сеанса для следующей страницы:

        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"];
            }
...