帮助刷新ASP.NET页清除公共数组

时间:2010-09-17 14:56:51

标签: asp.net vb.net visual-studio-2008

嘿所有,我是VB.net/ASP.net的新手,所以我需要一些帮助解决我目前遇到的问题。

我有一个ASCX.vb页面,允许用户从表中选择某人。一旦他们确实选择了某人,该页面就会将该人员信息重新加载到另一个表格下面的表格中,在那里他们可以为该人提交订单或删除该人员。

问题在于我想存储所选的用户ID,但似乎每次页面重新加载以显示更新时,它都会使我的数组再次变为默认值。

一旦他们选择了用户,这是我的代码:

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

因此,每次页面重新加载公共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 个答案:

答案 0 :(得分:3)

也许您对Web应用程序的无状态模型存在误解。任何未存储在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

现在,如果您使用此属性而不是变量,则可以操作该数组,只要用户在该页面上,该数组的值就会在回发中持续存在。

答案 1 :(得分:2)

在Page_Load方法中使用Page.IsPostBack属性。

此属性在第一次加载页面时为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