如何在回发上保持变量

时间:2008-10-21 18:48:58

标签: asp.net vb.net

我创建了一个页面(代码隐藏在.vb后面)并创建了Public intFileID As Integer

在页面加载中我检查查询字符串并在可用时分配它或设置intFileID = 0.

Public intFileID As Integer = 0

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        If Not Request.QueryString("fileid") Is Nothing Then
            intFileID = CInt(Request.QueryString("fileid"))
        End If

        If intFileID > 0 Then
            GetFile(intFileID)
        End If
    End If
End Sub

Private Sub GetFile()
    'uses intFileID to retrieve the specific record from database and set's the various textbox.text
End Sub

“提交”按钮有一个单击事件,它根据intFileID变量的值插入或更新记录。我需要能够在回发上坚持这一价值才能使它全部发挥作用。

该页面只是在SQL数据库中插入或更新记录。我没有使用gridview,formview,detailsview或任何其他rad类型的对象,它自己持有键值,我不想使用它们中的任何一个。

如何在不在HTML中创建可能被更改的内容的情况下,如何在intFileID中保留设置的值。

[编辑]更改了Page_Load以使用ViewState来保存intFileID值

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        If Not Request.QueryString("fileid") Is Nothing Then
            intFileID = CInt(Request.QueryString("fileid"))
        End If

        If intFileID > 0 Then
            GetFile(intFileID)
        End If

        ViewState("intFileID") = intFileID
    Else
        intFileID = ViewState("intFileID")
    End If
End Sub

9 个答案:

答案 0 :(得分:43)

正如其他人所指出的,您可以将其存储在Session或ViewState中。如果它是特定于页面的,我喜欢将它存储在ViewState中而不是Session中,但我不知道一种方法是否优先于另一种方法。

在VB中,您可以将项目存储在ViewState中,如:

ViewState(key) = value

并检索它:

value = ViewState(key)

答案 1 :(得分:5)

存储在:

  • 会话
  • 视图状态
  • 隐藏输入

答案 2 :(得分:5)

总结一下上面所说的内容。

您可以使用会话,视图状态或隐藏字段。

我个人更喜欢viewstate,因为它可以在Web场环境中运行,Session不会,它不会将它存储在等待用户的服务器上,最多可以删除20分钟,而且一般来说viewstate是用于页面级数据。

您可以使用隐藏字段,但用户可以更轻松地修改它。

答案 3 :(得分:4)

将其存储在会话中。

Page.Session["MyPage_FileID"] = intFileID

当用户导航时,您需要具有管理它的逻辑,但是如果它总是在页面从GET加载时设置(或者您清除它,如果在GET上不可用)那么您应该可以正常使用它稍后会在你提交PostBack的会话中。

答案 4 :(得分:2)

记住:

每次运行服务器代码时,它都位于页面类的全新实例中。这是针对每次回发的。

答案 5 :(得分:1)

实际上,由于ASP.NET页面回发到自身 - 包括查询字符串 - 您可以删除If Not Page.IsPostBack条件。然后它会在每个回发上设置自己。

答案 6 :(得分:1)

我个人会选择将值存储在控制状态而不是viewstate,因为viewstate可以很容易地关闭。即使viewstate因任何原因关闭,ControlState也会保持不变。我已经列举了一个如何做到这一点的例子。

Private intFileId As Integer = 0

Public Property FileID() As Integer
    Get
        Return intFileId
    End Get
    Set(ByVal value As Integer)
        intFileId = value
    End Set
End Property


Protected Overrides Function SaveControlState() As Object
    Dim objState(2) As Object
    objState(0) = MyBase.SaveControlState()
    objState(1) = Me.FileID
    Return objState
End Function


Protected Overrides Sub LoadControlState(ByVal savedState As Object)
    Dim objState() As Object
    objState = savedState
    MyBase.LoadControlState(objState(0))
    Me.FileID = CInt(objState(1))
End Sub




Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    Me.Page.RegisterRequiresControlState(Me)
End Sub


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not Page.IsPostBack Then
        If Not String.IsNullOrEmpty(Request.QueryString("fileid")) Then
            Me.FileID = CInt(Request.QueryString("fileid"))
        End If
    End If

    Response.Write(Me.FileID.ToString())
End Sub

答案 7 :(得分:1)

  

Session["KeyName"] = your value;

     
      
  1. 键入类型以检索并存储会话中的数据,如下所示:
  2.         

    Datatable dt = (DataTable)(Session["KeyName"]);

  

ViewState["KEY"]= value;

     
      
  1. 键入类型以检索并存储会话中的数据,如下所示:
  2.         

    String str = (String)ViewState["KEY"];

答案 8 :(得分:0)

我将会话用作suggested by tvanfosson. 如果您想在论坛的主题页面中保留大数据(如数据集)以进行评论,则ViewState和HiddenField可能会过重。

相关问题