Pasar datos por método POST a terceros

Bueno, un problema que se me presentó trabajando con Asp.net fue en un sitio que tenía que pasar por método POST ciertos datos a una página de pagos electrónicos.

La forma más práctica de pasar datos entre páginas aspx con el método POST es la que se detalla en esta página de forma sencilla:

NetCodigo.webinfo.es

Ahora, esto en el caso que yo describo no sirve, ya que no soy yo quien maneja los datos en la página destino, sino un tercero que espera que se los mande por POST.

Para solucionar esto escribí la siguiente clase, si alguno de ustedes se les presenta el mismo problema no tienen más que copiar/pegar el siguiente código (y después leerlo, obviamente jeje)


using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
/// Esta clase genera los formularios para mandar por post los datos a otras páginas
/// </summary>
public class RemotePost
{
    System.Collections.Specialized.NameValueCollection _Inputs = new System.Collections.Specialized.NameValueCollection();
    string _Url = "";
    string _Method = "post";
    string _FormName = "form1";<

    /// <summary>
    /// Devuelve o setea la url del medio de pago
    /// </summary>
    public string Url
    {
        get {return _Url;}
        set {_Url = value;}
    }

    /// <summary>
    /// Agrega inputs hidden al formulario
    /// </summary>
    /// <param name="name"></param>
    /// <param name="value"></param>
    public void Add(string name, string value)
    {
        _Inputs.Add(name,value);
    }
  
    /// <summary>
    /// Imprime en el cliente el formulario de compra
    /// </summary>
    public void Post()
    {
        System.Web.HttpContext.Current.Response.Clear();
        System.Web.HttpContext.Current.Response.Write("");
        System.Web.HttpContext.Current.Response.Write(String.Format("< html >< head >< /head >< body onload="\" >", _FormName));
        System.Web.HttpContext.Current.Response.Write(String.Format("<center><form target="\" name="\" method="\" action="\">", _FormName, _Method, Url));

        for (int i = 0; i < _Inputs.Keys.Count; i++)
        {
            System.Web.HttpContext.Current.Response.Write(String.Format("<input name="\" type="\" value="\">", _Inputs.Keys[i], _Inputs[_Inputs.Keys[i]]));
        }
        System.Web.HttpContext.Current.Response.Write("</form></center></body></html>")
    }
}



Bien, ¿y cómo se usa esto?

protected void Button1_Click(object sender, EventArgs e)
{
RemotePost myremotepost = new RemotePost();
myremotepost.Url = "URL DE DESTINO";
myremotepost.Add("NombreItem", "ValorItem");
myremotepost.Add("NombreItem2", "ValorItem2");
myremotepost.Add("NombreIntem3", "ValorItem3");
myremotepost.Post();
}


Espero que esto les pueda servir! Cualquier duda consulten!

Espero sus comentarios!

Saludos!

Un pequeño post de humor hoy,

Siempre viene bien un momento de distracción!



Saludos!

Carrito de compras

Un trabajo que tuve que hacer en la universidad fue un sitio de ventas de artículo electrónicos.

Una buena implementación de un carrito son las variables de sesión (siempre que no se quiera un carrito persistente obviamente).

Lo recomendable siempre en este tipo de sitios es tener un modelo de tres capas, separando diseño, lógica y acceso a datos.

Visto de este modo necesitaremos una clase que maneje la lógica de negocios del carrito.

Para acceder a las variables de sesión desde una clase se debe usar lo siguiente:

HttpContext.Current.Session["NombreClave"]


También un punto a no olvidar es que hay que establecer en el archivo global.asax que al inicio de cada sesión el carrito no tiene productos cargardos.
void Session_Start(object sender, EventArgs e)
{
Session.Clear();
Session["TotalArts"] = 0;
}


Bueno, sin más, les dejo el código de nuestra clase para la lógica del carrito de compras:
using System;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.SessionState;
using System.Collections.Generic;

///


/// Clase que maneja el carrito de compras
///


namespace BLL
{
public class ShoppingCart
{
public ShoppingCart()
{

}

///
/// Devuelve la cantidad de artículos que se van a comprar
///

public static int TotalActiveArts
{
get
{
int count = 0;

for (int i = 1; i <= Convert.ToInt32(System.Web.HttpContext.Current.Session["TotalArts"]); i++) { if (HttpContext.Current.Session["IdArt" + i.ToString()].ToString() != "0") count++; } return count; } } ///
/// Devuelve el total de los artículos guardados en sesión
///

private static int TotalArts
{
get
{
return Convert.ToInt32(System.Web.HttpContext.Current.Session["TotalArts"]);
}
}


public static void AddArtInCart(int categoryId, string name, string description, string urlImage, decimal price, int memberId)
{
HttpContext.Current.Session["TotalArts"] = TotalArts + 1;
HttpContext.Current.Session["CategoryIdArt" + TotalArts.ToString()] = categoryId;
HttpContext.Current.Session["NameArt" + TotalArts.ToString()] = name;
HttpContext.Current.Session["DescriptionArt" + TotalArts.ToString()] = description;
HttpContext.Current.Session["UrlImg" + TotalArts.ToString()] = urlImage;
HttpContext.Current.Session["PriceArt" + TotalArts.ToString()] = price;
HttpContext.Current.Session["IdArt" + TotalArts.ToString()] = 1;
}

///
/// Guarda cada uno de los artículos en la BD.
///

public static void Purchase()
{
for (int i = 1; i <= TotalArts; i++) { if (HttpContext.Current.Session["IdArt" + i.ToString()].ToString() != "0") { HttpContext.Current.Session["IdArt" + i.ToString()] = /*MÉTODO DE ALTA DE ARTÍCULO*/ ; } } } ///
/// Borra los artículos de la sesión. Devuelve un string con un mensaje al usuario.
///

///
public static string Payed()
{
string state = "Gracias";

try
{
for (int i = 1; i <= TotalArts; i++) { HttpContext.Current.Session.Remove("TotalArts"); HttpContext.Current.Session.Remove("CategoryIdArt"); HttpContext.Current.Session.Remove("NameArt"); HttpContext.Current.Session.Remove("DescriptionArt"); HttpContext.Current.Session.Remove("UrlImg"); HttpContext.Current.Session.Remove("PriceArt"); HttpContext.Current.Session.Remove("IdArt"); HttpContext.Current.Session.Remove("TotalArts"); } } catch { state = "Ha habido un problema con el registro de tu compra"; } return state; } ///
/// Devuelve la tabla con los artículos activos en la sesión
///

///
public static DataTable ShopTable()
{
DataTable dt = new DataTable();

DataColumn[] dcColumns = new DataColumn[3];

dt.Columns.Add("Id");
dt.Columns.Add("Artículo");
dt.Columns.Add("Precio");

dt.Columns.AddRange(dcColumns);

for (int i = 1; i <= TotalArts; i++) { if (HttpContext.Current.Session["IdArt" + i.ToString()].ToString() != "0") { DataRow dr = dt.NewRow(); dr["Id"] = HttpContext.Current.Session["IdArt" + i.ToString()].ToString(); dr["Artículo"] = HttpContext.Current.Session["TitleArt" + i.ToString()].ToString(); dr["Precio"] = HttpContext.Current.Session["PriceArt" + i.ToString()].ToString(); dt.Rows.Add(dr); } } return dt; } } }


Para los que estén interesados en un sitio de compras, pronto iré agregando más info útil, sobre todo enfocada a la BLL y la DAL.

Espero que les sirva!

Saludos!!