martes, 28 de octubre de 2014

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.

No hay comentarios.:

Publicar un comentario

Nota: sólo los miembros de este blog pueden publicar comentarios.

Mover mensajes seleccionados a un personal folder en Oulook 2016

Este es un ejemplo de como mover los mensajes seleccionados a un personal folder (pst) en Outlook 2016 usando VBA. Sub MoveInbox()     Mov...