lunes, 10 de noviembre de 2008

Pasar datos entre paginas web en ASP.NET

Aqui enumero los posibles metodos de pasaje de datos entre paginas ASP.NET ya sea en el cliente o en el mismo servidor.

Pero espero que este breve resumen sea util (al igual que los enlaces)

  1. Pasaje con Querystring
  2. Buscando en la coleccion Request.Form
  3. Utilizando cookies
  4. Leer mediante JS en la ventanas popup
  5. Con una propiedad public dentro de la pagina de origen
  6. Buscando el control dentro de PreviousPage
  7. Utilizando las variables de session
  8. Utilizar Context

OPCION 1: Pasaje con Querystring

El mas famoso y antiguo metodo, aqui ya sabes como debe y donde debe ir las variables... en la URL
Aqui tambien se podria armar con JS (=javascript) lo que quieras con tal de enviar por la URL a la otra pagina, por ejemplo si tienes una pelicula flash que deba enviar por enlaces a otra pagina en la url o si tienes que armar un enlace para que en la llamada a su pagina de destino incluya las variables. Mas info sobre QueryString
Tiene un limite para escribir ya que algunos navegadores no permiten mas que una cierta extension de url (y hay que pensar para navegadores mas antiguos)
Tambien hay metodos para encriptar nuestro querystring, que lo puedes investigar, aqui unos enlaces

OPCION 2: Buscando en coleccion Request.Form

Aqui tambien es casi parecido a como creamos paginas anteriormente.

La idea leer las key de la coleccion Request.Form, esto es conveniente cuando las paginas estan en aplicaciones web diferentes (sitios web separados)
Es un poco (solo un poco) mas seguro que enviar parametros por URL como el anterior metodo (Querystring) aqui las variables van en el encabezado HTTP, por consiguiente podremos enviar mas datos.
Mas info sobre Request.Form

OPCION 3: Utilizando cookies

Aqui podremos guardar pequeñas porciones (y muy pequeñas de informacion) de cadenas de texto, de echo ya lo venimos utilizando con la session de ASP.NET que se guarda por defecto en una cookie
hay que tener en cuenta que es un archivo en el cliente que lo guarda el navegador por un tiempo determinado y que es susceptible al borrado. Pero en algunas ocaciones es util
Mas info: Información general sobre las cookies en ASP.NET


OPCION 4: Leer mediante JS en ventanas popup

Para la pagina previa (padre) o para la hija (el popup open)
Esta tecnica es puro JS, mediante el cual podemos leer controles html en el padre y colocarlas en la pagina hija como viceversa.

Ejemplo: Asignando un valor a un control en la pagina padre (esto es javascript)

var miValor = window.opener.document.Form1.miTextbox.value;

//Otra forma
var miValor = window.opener.document.getByElementId(‘miTextbox’).value;

Ejemplo: Asignando un valor a un control a la pagina hija

//Abriendo  una ventana hija
var winHija;
winHija = window.open(...);

//Entonces
var nombre = winHija.document.form1.txtNombre.value;
//o
var nombre = winHija.document.getElementById("txtNombre").value;



OPCION 5: Con una propiedad public dentro de la pagina origen

Y tendrias algo asi en la pagina B:

Label1.Text = PreviousPage.CurrentCity 

Aqui un articulo de Sergio Tarrilo

- Pasando variables entre paginas web ASP.NET usando Cross Page Postback (por Sergio Tarrillo)

- Pasando Valores entre Paginas (por Francisco Javier Carbajosa)

(mira el primer enlace mas abajo. Cómo: Pasar valores entre páginas Web ASP.NET)



OPCION 6: Buscando el control dentro de PreviousPage

Aqui la "magia" que hay detras de esto es el Viewstate, el gran contenedor de casi todo y alli es que "viaja" los controles y su estado.
Por eso funciona solo si esta habilitado el viewstate en los controles que necesites recuperar, y ademas que el traspaso de pagina y pagina sea a traves de elementos normales mmm por ejemplo con un popup en JS no sirve este metodo.
Esto de guardar el estado lo hace solo los webcontrol, pero igualmente podremos utilizar este “Repositorio” para guardar algo serializable, ya que se guarda una cadena. Mas info: Cómo: Guardar valores en el estado de vista

Mas info sobre ViewState:

OPCION 7: Utilizando las variables session

Es comun escuchar: "Pon dentro de una variable de session y luego lo recuperas"
Bueno ... si no te queda otra hay que hacerlo (pero tampoco es colocar todos tus colecciones de objetos).. estas ocupando memoria del servidor. Mas info sobre Session
Ademas si es por cache hay metodos para realizarlo cache mas optimizados.
Lo malo: No tiene intellisense, ups! pero podrias encapsular, algo asi la idea:

Public Class MiSession
Public Shared Function MiObjeto() as MiClase
Dim obj as MiClase
Try
obj = Ctype(Session("miobj") , MiClase)
Catch ex as Exepcion
End Try
If obj Is Nothing Then
obj = new MiClase
Session("miobj") = obj
End if
return obj
End Function
End Class




OPCION 8: Utilizar Context

Aqui la pregunta es.. que es Context?
"(..)Almacena los valores específicos de solicitud de la aplicación para que se encuentre disponible desde cualquier parte del código que participa en el procesamiento de una solicitud(..)"
Al igual que el ViewState para guardar par de valores en una colecccion y recuperarlas mediante una clave (key) en cada peticion de la pagina este coleccion Context solo es valida para la solcitud (no perdura mas alla de esa peticion) , es decir no para uso exclusivo en el servidor, no va al cliente nada.
Un ejemplo:

Code Snippet

Dim Context As HttpContext
Context = HttpContext.Current
Context.Items.Add("miEjemplo", "UnEjemplo")
Server.Transfer("Pagina2.aspx")

En la otra pagina = Pagina2.aspx

Code Snippet

Dim Context As HttpContext
Context = HttpContext.Current
If Context.Items.Contains("miEjemplo") Then
Me.lblTest.Text = CType(Context.Items("miEjemplo").ToString, String)
'o tambien:
'Me.lblTest.Text = Context.Items("miEjemplo").ToString()
Else
Me.lblTest.Text = "No existe item myItem en el Contexto"
End If

Enlaces

Fuente del Artículo:
http://geeks.ms/blogs/fernandezja/archive/2008/10/21/pasar-datos-entre-paginas-web-en-asp-net.aspx

No hay comentarios: