2008-10-21 18 views
22

creé una sola página (con código detrás .vb) y crearon intFileID Pública como número enterocómo conservar variable de devolución de datos

en la carga de la página verifico para la cadena de consulta y asignarlo si está disponible o conjunto 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 

No es un evento de clic en el botón Enviar para que inserta o actualiza un registro basado en el valor de la variable intFileID. Necesito poder persistir ese valor en la devolución de datos para que todo funcione.

La página simplemente inserta o actualiza un registro en una base de datos SQL. No estoy usando una vista de cuadrícula, vista de formulario, vista de detalles ni ningún otro objeto de tipo rad que persista el valor de la clave por sí mismo y no deseo utilizar ninguno de ellos.

¿Cómo puedo persistir el valor establecido en intFileID sin crear algo en el HTML que posiblemente podría modificarse?

[EDIT] Load cambia para utilizar ViewState para conservar el valor 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 

Respuesta

40

Como otros han señalado, se puede almacenar en la sesión o el ViewState. Si es específico de la página, me gusta almacenarlo en el ViewState en lugar de en la Session, pero no sé si un método es generalmente preferido sobre el otro.

En VB, que almacenaría un elemento en el ViewState como:

ViewState(key) = value 

y recuperarlo como:

value = ViewState(key) 
+0

Wow. No haga clic en el enlace. Spam City. –

+0

Yikes. Debe haber cambiado desde 2008. Lo eliminé. – jerhinesmith

4

tienda en la sesión.

Page.Session["MyPage_FileID"] = intFileID 

Usted necesita tener lógica que lo maneja como el usuario navega alrededor, pero si siempre se establece cuando se carga la página de un GET (o que lo elimine, si no está disponible en GET), entonces Debería estar bien usarlo más tarde desde la Sesión en su envío PostBack.

+0

gracias! ¿Dónde debería establecer el valor? justo después de inicializar intFileID en la carga de página? –

+0

Agrégalo a la sesión después de que tenga su valor final. En su caso, después de establecer el valor de los parámetros de solicitud. – tvanfosson

4

tienda en:

  • Sesión
  • ViewState
  • entrada oculta
2

Recuerde:

Cada vez que su código de servidor se ejecuta, es en una nueva instancia de su clase de página. Eso es para cada devolución.

5

Solo para resumir lo que se dice arriba.

Puede usar Session, Viewstate o un campo oculto.

Personalmente prefiero viewstate, ya que funcionará en entornos de granja web, la sesión no, no la almacena en el servidor en espera del usuario, se pueden eliminar hasta 20 minutos y, en general, viewstate es el lugar ser para datos de nivel de página.

Puede utilizar un campo oculto, pero luego un usuario podría modificarlo más fácilmente.

+0

gracias por los detalles sobre la Sesión. Esta aplicación probablemente nunca se ampliará más allá de una cuenta de hosting compartido, pero es bueno saberlo de antemano. –

1

En realidad, dado que una página ASP.NET se devuelve a sí misma, incluida la cadena de consulta, puede eliminar la condición If Not Page.IsPostBack. Luego se establecería en cada devolución.

1

Yo personalmente elegiría almacenar el valor en estado de control en lugar de viewstate ya que viewstate puede ser apagado fácilmente. ControlState persistirá incluso si viewstate se apaga por cualquier motivo. He incluido un ejemplo sobre cómo se puede hacer esto.

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

gracias por la muestra. Tendré que leer sobre ese método. –

0

voy a utilizar como suggested by tvanfosson. Sesión ViewState y HiddenField podría ser demasiado pesado si desea mantener grandes cantidades de datos como un conjunto de datos para los comentarios en páginas de temas de un foro ..

1

Session["KeyName"] = your value;

  1. Escriba el tipo para recuperar y almacenar los datos de la sesión como se indica a continuación:

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

o

ViewState["KEY"]= value;

  1. Tipo conversión al tipo de recuperar y almacenar los datos de sesión como se indica a continuación:

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

+0

La sesión es la mejor opción, ya que persistirá el valor de la sesión donde el estado de vista persistirá de POST a POST, es decir, cada vez que haya una publicación, el valor de la variable se establecerá según el valor en el estado. Para obtener más información, lea Understanding ASP.NET ViewState [https://msdn.microsoft.com/en-us/library/ms972976.aspx]. –

Cuestiones relacionadas