Ir al contenido principal

Formas de pasar datos entre páginas web

Existen diferentes formas de pasar datos entre formas en la web. Sabemos que el protocolo http no guarda el estado (stateless), asi que los datso deben ser guardados en alguna parte. A diferencia del ASP tradicional en ASP.NET existen diferentes vias para hacerlo:
  1. Query String.
  2. Cookies.
  3. Variables de sesión.
  4. Cross Page Posting.
  5. Submit Form.
  6. Server.Transfer o Server.Execute.
1.- QueryStrings: Para pasar el contenido de TextBox1.Text de WebForm1 a Webform2 en el evento click de Button1.
   Para enviarlo:
   protected void Button1_Click(object sender, EventArgs e)
                   {
                        Response.Redirect("WebForm2.aspx?id=" + TextBox1.Text);
                   }
   Para recibirlo:

   string queryStringID = Request.QueryString["id"];
2.- Cookies
Para guardar el valor de TextBox1.Text en una cookie:
   protected void Button1_Click(object sender, EventArgs e)
                            {
                               HttpCookie cookie = new HttpCookie("UserName");
                               cookie.Value = TextBox1.Text;
                               cookie.Expires = DateTime.Now.AddDays(1);
                               Response.Cookies.Add(cookie);
                               Response.Redirect("WebForm2.aspx");
                             }

Para leerla:

   if(Request.Cookies["UserName"] != null)
                             Response.Write(Request.Cookies["UserName"].Value);
3.- Variables de Sesión:

   Para poner el valor del TextBox1.Text en una variable de sesión:
      protected void Button1_Click(object sender, EventArgs e)
                                            {
                                                Session["UserName"] = TextBox1.Text;
                                                Response.Redirect("WebForm2.aspx");
                                            }
Para leerla:

       Response.Write(Session["UserName"]);
4.- Cross Page Posting:
Poner en la propiedad PostBackUrl del Button1 la dirección de la segunda página:
   Y en la segunda página podemos obtener el valor de la siguiente manera:
         TextBox txtFirstPage = (TextBox)(PreviousPage.FindControl("TextBox1"));
      Response.Write(String.Format("You wrote {0} in Page1",txtFirstPage.Text));

5.- Submit Form.

Esto funciona con controles HTML que no sean del lado del servidor.
Ejemplo de la primera página:
  <form id="Form1" method="post" runat="server">
     <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  </form>
   <form name="SubmittedForm" action="WebForm2.aspx" method="post">
      <input id="Submit1" type="submit" value="submit" onclick="CopyTextToHiddenField()" />
      <input name="Hidden1" type="hidden" />
    </form>

La función CopyTextToHiddenField() copia el valor de la caja de texto a un campo escondido. Hay que ponerla dentro del tag <head> como en el siguiente ejemplo:
<script language="javascript">
            function CopyTextToHiddenField()
            {
                 var textbox1Value = document.getElementById("<%=TextBox1.ClientID%>").value;
                 document.forms[1].document.getElementById("Hidden1").value = textbox1Value;
            }
</script>

Ahora podemos obtener el valor de la siguiente manera:
   Response.Write(Request.Form["Hidden1"]);  
6.- Server.Transfer o Server.Execute:
En la página que tenemos nuestra forma debemos usar el Server.Transfer o Server Execute:
protected void Button1_Click1(object sender, EventArgs e)
 {  
    Server.Transfer("WebForm2.aspx", true);
  }


En la página en que queremos obtener los datos:

 Response.Write(Request.Form["TextBox1"]);

Estas son las formas que el sitio de Microsoft nos dice que podemos usar, pero hay una forma que a mi parecer es la mejor de las que he mostrado anteriormente (aunque no sea la ideal en todos los casos) y es la siguiente:
En la página inicial colocamos nuestros controles y los exponemos como propiedades:
 public partial class _Default : System.Web.UI.Page
{

     public TextBox pp_Nombre
    {
         get { return TextBox1; }
     }
     public TextBox pp_Telefono
     {
  get { return TextBox2; }
    
     }
     protected void Page_Load(object sender, EventArgs e)
     {

     }
 }

Y en la segunda página colocamos la siguiente directiva:
   <%@ PreviousPageType VirtualPath="~/Default.aspx"  %>
Después colocamos el siguiente código para leer los datos:
public partial class Default2 : System.Web.UI.Page
 {
     protected void Page_Load(object sender, EventArgs e)
     {
         Label1.Text = PreviousPage.pp_Nombre.Text;
         Label2.Text = PreviousPage.pp_Telefono.Text;

     }
 }


Como pueden ver en .NET existen varias formas de hacerlo y podemos escoger el que más se ajuste a nuestras necesidades.
NOTA:
Si estás usando Master Pages puedes usar Cross Page Posting, pero al buscar el control debes obtener primero una referencia al ContentPlaceHolder ya que es el contenedor de los controles de tu página aspx.
Ejemplo:
En la primera página pones en el control que vaya a llamar a la otra página el nombre de esta en la propiedad PostBackUrl.
y en la segunda accedes a los controles de la siguiente manera:
protected void Page_Load(object sender, EventArgs e)
   {
      if (Page.PreviousPage != null)
      {
         ContentPlaceHolder cph = (ContentPlaceHolder)Page.PreviousPage.Master.FindControl("LessonsLearnedPlaceHolder");
            if (cph != null)
            {
               TextBox Sourcelbl = (TextBox)cph.FindControl("txtfailureid");
               Component cmp = new Component();
               if (Sourcelbl != null)
               {
                  this.LblFailureid.Text = Sourcelbl.Text;
                  cmp.FailureID = LblFailureid.Text;
               }
            }
         }

      }
Y con esto tendremos acceso a las propiedades de todos los controles de la página previa.

Comentarios

Entradas más populares de este blog

Eliminar registros repetidos de una DataTable

A continuación les muestro un ejemplo de como eliminar los registros repetidos de una DataTable . //DataTable con los reqistros repetidos (myRepeatedData) //Filtramos los registros únicos en la variable var. var uniqueRows = myRepeatedData.AsEnumerable().Distinct(DataRowComparer.Default); //Lo copiamos a otra DataTable DataTable myUniqueData = uniqueRows.CopyToDataTable(); Con esto tendremos en la DataTable myUniqueData los registros únicos.

Obtener el valor de un control ASPxSpinEdit dentro de un ASPxGridView

Para obtener el valor de un control ASPxSpinEdit dentro de un ASPxGridView -Agregar un control ASPxSpinEdit dentro del DataItem Template -Hacer que se muestren los datos de la fuente poniendo en el atributo value la expressión siguiente: ' <%# Bind("GroupCode") %> '  donde GroupCode es el nombre de la columna en la fuente de datos. -Hacer que el evento ValueChanged se procese en el servidor agregando lo siguiente en los eventos del cliente:   <ClientSideEvents ValueChanged="function(s, e) {  e.processOnServer = true; }" /> El markup completo de la columna quedaría así: <dx:GridViewDataTextColumn Caption="Grupo" FieldName="GroupCode" ShowInCustomizationForm="True" VisibleIndex="4">    <PropertiesTextEdit DisplayFormatInEditMode="True" DisplayFormatString="g">    </PropertiesTextEdit>    <DataItemTemplate>       <dx:ASPxSpinEdit ID="spinEdi...

Mostrar un Loading Panel al cargar y al procesar los datos que consuman mucho tiempo de proceso

Primero hay que crear el Panel como en el siguiente ejemplo: <dx:ASPxLoadingPanel ID="loadingPanel" ClientInstanceName="loadingPanel" runat="server" Modal="true"         Width="70%" Height="30px" Text="Se está procesando su petición; por favor no abandone la sesión porque podría tener inconsistencia en sus datos..." >     </dx:ASPxLoadingPanel> Crear una función con Javascript que muestre el panel :  function showLoadingPanel() {         loadingPanel.Show();     } Si se desea que solo muestre el panel encima de un control como el ASPxGridview se puede usar el método ShowInElementByID del Panel: function showLoadingPanel() {         loadingPanel.ShowInElementByID(grvHarnessItems.name);     } Crear una función con Javascript que esconda el panel:   function OnControlsInitialized(s, e) {         setTimeout(function () {   ...