【问题标题】:How to Persist Variable on Postback如何在回发中保留变量
【发布时间】:2010-09-18 09:21:43
【问题描述】:

我创建了一个页面(代码在 .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 类型的对象,它们本身会保留键值,我不想使用它们中的任何一个。

如何保持 intFileID 中设置的值,而不在 HTML 中创建可能被更改的内容。

[EDIT] 将 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

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

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

    在 VB 中,您可以在 ViewState 中存储一个项目,例如:

    ViewState(key) = value
    

    然后像这样检索它:

    value = ViewState(key)
    

    【讨论】:

      【解决方案2】:

      存放在:

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

      【讨论】:

        【解决方案3】:

        只是总结一下上面所说的。

        您可以使用 Session、Viewstate 或隐藏字段。

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

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

        【讨论】:

        • 感谢有关 Session 的详细信息。此应用程序可能永远不会扩展到共享主机帐户之外,但最好提前了解。
        【解决方案4】:

        将其存储在 Session 中。

        Page.Session["MyPage_FileID"] = intFileID
        

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

        【讨论】:

        • 谢谢!我应该在哪里设置值?在页面加载中初始化 intFileID 之后?
        • 在获得最终值后将其添加到会话中。在您的情况下,在您从请求参数设置值之后。
        【解决方案5】:

        记住:

        每次您的服务器代码运行时,它都会在您的页面类的全新实例中。这适用于每次回发。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我个人会选择将值存储在控件状态而不是视图状态中,因为视图状态很容易被关闭。即使视图状态因任何原因被关闭,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
            

            【讨论】:

              【解决方案8】:

              Session["KeyName"] = your value;

              1. 类型转换为从会话中检索和存储数据的类型,如下所示:

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

              ViewState["KEY"]= value;

              1. 类型转换为从会话中检索和存储数据的类型,如下所示:

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

              【讨论】:

              • Session 是更好的选择,因为它将保留会话的值,因为视图状态将从 POST 持续到 POST,即每次回发时,变量的值将根据状态中的价值。有关详细信息,请阅读了解 ASP.NET ViewState [msdn.microsoft.com/en-us/library/ms972976.aspx]
              【解决方案9】:

              我将使用 Session 作为suggested by tvanfosson. 如果您想在论坛的主题页面中保留大型数据(例如 cmets 的数据集),ViewState 和 HiddenField 可能会过于繁重。

              【讨论】:

                猜你喜欢
                • 2013-01-16
                • 1970-01-01
                • 2011-11-18
                • 2023-02-18
                • 2013-07-17
                • 2011-08-26
                • 1970-01-01
                • 2012-01-28
                • 2020-12-29
                相关资源
                最近更新 更多