2008-10-21 80 views
22

变量i页面加载创造了单页(背后的.vb代码)和创建公共intFileID作为整数如何坚持回发

我检查查询字符串,如果可用或设置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中创建可能会更改的内容。

[编辑]更改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 

回答

40

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

在VB中,你将一个项目存储在象ViewState这样的:

ViewState(key) = value 

和检索它像:

value = ViewState(key) 
+0

哇。不要点击链接。垃圾邮件城市。 – 2015-11-30 15:52:53

+0

哎呀。自2008年以来必须改变。删除它。 – jerhinesmith 2015-11-30 23:06:39

4

储存于会话。

Page.Session["MyPage_FileID"] = intFileID 

你必须为用户导航围绕管理它的逻辑,但如果它是始终设置在从GET页面加载(或你清楚,如果不是可以用GET),那么你应该可以在会议后使用它提交PostBack。

+0

谢谢!我应该在哪里设置价值?刚刚在页面加载中初始化intFileID之后? – 2008-10-21 19:07:40

+0

在它具有最终值后将它添加到会话中。在你的情况下,在你设置请求参数的值之后。 – tvanfosson 2008-10-21 19:14:58

4

储存于:

  • 会议
  • 的ViewState
  • 隐藏输入
2

记住:

每个服务器代码运行时,它的在一个崭新的页面类实例中。这是每个回发。

5

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

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

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

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

+0

感谢有关Session的细节。这个应用程序可能永远不会扩展到共享主机帐户之外,但最好先了解一下。 – 2008-10-21 19:11:18

1

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

1

我个人会选择将值存储在控制状态而不是视图状态,因为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 
0

我将使用会话为suggested by tvanfosson. 的ViewState和HiddenField可能是,如果你想保留大数据像在一个论坛的主题页面的评论数据集太重..

1

Session["KeyName"] = your value;

  1. 类型强制类型检索和存储会话中的数据,如下所示:

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

ViewState["KEY"]= value;

  • 类型转换的类型来检索和数据从会话存储像如下:
  • String str = (String)ViewState["KEY"];