Помогите с обновленным открытым массивом ASP.NET страниц - PullRequest
0 голосов
/ 17 сентября 2010

Привет всем, я новичок во всем VB.net/ASP.net, поэтому мне нужна помощь с проблемой, которая у меня сейчас есть.

У меня есть страница ASCX.vb, которая позволяет пользователю выбрать кого-тосо стола.Как только они выбирают кого-то, страница перезагружается с этой информацией о людях в другую таблицу под той, где они могут отправить заказ для этого человека или удалить этого человека.

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

Это мой код, когда они выбирают пользователя:

Namespace prog.Controls
  Partial Public Class progReportGrid
  etc....

  Public strIDArray() As String = {"0000770000"} 'Just a dummy place holder

Private Sub gvData_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvData.RowCommand

  Dim idIndexNumber As Integer = Array.IndexOf(strIDArray, strID)

  For i As Integer = 0 To strIDArray.Length - 1
      System.Diagnostics.Debug.WriteLine(strIDArray(i))
  Next

  If idIndexNumber = -1 Then
      ReDim Preserve strIDArray(strIDArray.Length)
      strIDArray(strIDArray.Length) = strID
      RaiseEvent EmployeeSelected(Me, New ESEventArgs(strID))
  End If
End Sub

Поэтому каждый раз на страницу перезагружается Public strIDArray () As String = {"0000770000"} вызывается снова и, конечно, очищает все, что было сохранено, кроме 0000770000.

Какмогу ли я помешать этому?

ОБНОВЛЕНИЕ

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
             'do what?
        End If
End Sub

Дэвид

Ответы [ 2 ]

3 голосов
/ 18 сентября 2010

Возможно, у вас возникло недоразумение с моделью веб-приложения без сохранения состояния.Все, что не хранится в ViewState или Session или в переменной общего приложения, НЕ будет сохраняться при обратной передаче.

Это означает, что когда вы объявляете Public strIDArray() As String как стандартную переменную, она будет инициализироваться каждый раз, когдастраница сообщений назад.Например, вот простой пример того, как это работает:

  • Пользователь открывает свой браузер и открывает веб-страницу aspx.
  • Запрос отправляется на ваш сервер, и всеэлементы управления, включая progReportGrid, создаются как новые экземпляры и добавляются на страницу.(здесь ваша переменная каждый раз устанавливается на свое первоначальное значение)
  • Запускается куча событий, включая событие Me.Load
  • Элементы управления, которые были добавлены на страницу, должнысгенерировать их HTML
  • HTML-код, собранный из всех элементов управления на странице, отправляется обратно пользователю

Таким образом, поскольку все элементы управления повторно создаются каждый раз назад, переменные класса, такие какstrIDArray в значительной степени выбрасывается после того, как страница отправлена ​​пользователю.

Вместо этого, если вы хотите, чтобы страница помнила, какое значение имел массив при последней обратной передаче, и добавила к ней больше при следующей обратной передаче, вы должны использовать либоViewState или Session.

Например:

Private Property StrIDArray() As String()
  Get
    If ViewState("StrIDArray") Is Nothing
       ViewState("StrIDArray") = New String() {"0000770000"}
    Return ViewState("StrIDArray")
  End Get
  Set(ByVal value As String())
     ViewState("StrIDArray") = value
  End Set
End Property

Теперь, если вы используете это свойство вместо своей переменной, вы можете манипулировать этим массивом, пока пользователь находится на этой странице,значение этого массива будет сохраняться во всех обратных передачах.

2 голосов
/ 17 сентября 2010

Используйте свойство Page.IsPostBack в вашем методе Page_Load.

Это свойство имеет значение false в первый раз, когда страница загружается, и значение false для каждого последующего постбэка.

Если вы установите значение по умолчанию strIDArray() = {"0000770000"} в пределах If (Page.IsPostBack <> true), оно не будет сброшено при обратной передаче.

РЕДАКТИРОВАТЬ: мой синтаксис VB очень шатко, но позвольте мне попробовать его

Partial Public Class EARNReportGrid 

Begin

Public strIDArray() As String // DO NOT INITIALIZE it here. ONLY DECLARE IT
.....

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
        If Not Page.IsPostBack Then 
             //INITIALIZE the ARRAY
             strIDArray = New String(){"00007700000"}
        End If 
End Sub
......    
End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...