【问题标题】:Help with refreshed ASP.NET page clearing public array帮助刷新 ASP.NET 页面清除公共数组
【发布时间】:2010-09-17 14:56:50
【问题描述】:

大家好,我是 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

因此,每次页面重新加载时,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

大卫

【问题讨论】:

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


    【解决方案1】:

    也许您对 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:虽然我会将 cookie 和隐藏的表单字段添加到存储位置列表中。对于这个特定项目,我建议使用隐藏的表单字段。
    【解决方案2】:

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

    该属性在页面第一次加载时为 false,之后每次回发时为 false。

    如果您在If (Page.IsPostBack <> true) 中设置默认值strIDArray() = {"0000770000"},则回发时不会重置。

    编辑:我的 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
    

    【讨论】:

    • 感谢您的回复,In。在上面查看我更新的代码。我在启动时已经有了,但我无法在其中有一个公共数组......
    • 更新了答案 - 希望这会有所帮助!数组的声明应该仍然是它之前的位置。只是初始化被移动到 NOT Page.IsPostback 部分。请原谅我的 VB.net 语法 - 我以为我还记得它,但我的虚荣心大于我的记忆
    • 当它尝试执行 Array.IndexOf(strIDArray, strID) 时,它现在返回 strIDArray 作为 nothing
    • 您没有在回发时使用更新后的值更新 strIDArray 吗? NOT Page.IsPostback 的 else 部分应该根据第一次加载页面时选择的用户 ID 在数组中设置正确的值
    • 当它添加到数组时,它会通过不同的子。当它开始检查数组中的内容时,它说当应该有 至少 00007700000 时什么都没有。
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多