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.
Este post lo tenia en borrador y como justamente hoy preguntaron algo similar en los foros y grupos de noticias de ASP.NET lo dejo por aqui para referencia.

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

8 comentarios en “Pasar datos entre paginas web en ASP.NET”

  1. Muy buen recopilatorio, y muchas veces no se tiene claro que modelo usar.

    Y no abusar tampoco, no voy a pasar 15 o 20 variables de una página a otra (para ahorrar un coste en ya no ir a la base de datos) ahorras en viaje pero tiene un costo. A veces es más simple pasar el id, recuperarlo en la otra página, y obtener el resto de la información de la base de datos.

    Saludos,

  2. Hola espinete
    Me gusto como preguntaste! “desarrollos reales” 🙂
    Bueno casi como que utilice TODOS, desde el mas simple por querystring con datos no sensibles (pero ultimamente estoy ocultando la url, haciandola mas user-friendly con URLRewriter), otros datos los obtengo de los controles en el mismo postback. En algunas oportunidades tuve que realizar con js envios desde ventanas padres a hijas y viceversa, un dolor de cabeza pero era necesario, hoy tengo muchas ventanas modales para que no sean window.open je
    Y con Context lo utilizo para en la misma peticion tener un metodo de obtener informacion en un control y leerlo en otro control que renderiza UI

    La idea del post era que tengas un pantallazo y que en base a tu experiencia, logres detectar cual utilizar en un momento determinado.
    Saludos

  3. Buenos días,

    La consulta que voy a realizar no estoy seguro si tiene algo que ver con el tema del foro pero si me pueden ayudar, les estaré muy agradecido.

    Por favor ayúdenme, con esto:

    Necesito crear un script que envíe parámetros post a una web.

    La web es “http://evtde.argonautanet.com/Varios/ComprobacionTelefono.aspx”.

    Y los parámetros post que quiero enviar son:

    FRAME F=0
    TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:aspnetForm ATTR=ID:ctl00_Main_txtTelefono CONTENT=12344556
    ONDIALOG POS=1 BUTTON=OK CONTENT=
    TAG POS=1 TYPE=INPUT:IMAGE FORM=ID:aspnetForm ATTR=ID:ctl00_Main_BtnComprobar

    Saludos

  4. buenas tardes tengo una duda se que no tiene relacion con esto pero bueno:

    espero y me puedas ayudar desde hace ya rato que mi servidor web se cayo pero egun esto ya quedo pero apartir de alli cuando trato de cargarle algun codigo este no se actualiza al 100% o no se actualiza antes lo hacia con el remot de visual studio directamente al servidor pero desde que se daño el server ya no lo puedo hacer me dice que no tiene las extenciones de front page y ya se las trate de instalar pero nada no me permite espero y me puedan ayudar

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *