2

Webブラウザを介して顧客による注文を変更する方法を見つけようとしています。顧客は、製品ID(キー)、製品名、製品の価格、および必要な数量を含むアイテムを注文します。OLDアイテムを古い数量に置き換え、同じアイテムの数量が異なるため、基本的にクリックしてアイテムを選択し、購入したい2つの異なる数量を配置することで注文を変更する方法を知りたいです。ショッピングカートには購入したアイテムが入っているので、ショッピングカートからOrderItemを破棄して、それを再作成するにはどうすればよいか考えていました。

私のコードがすでにショッピングカートに入っているキーを見つけたら、それを破棄して、新しいQuanitity(Webアプリのテキストボックス)で再作成する必要があります。

  protected void btnOrder_Click(object sender, EventArgs e)
{
    //Check for Shoppingcart object
    // Create first if not there
    if (Session["cart"] == null)
        Session["cart"] = new ShoppingCart();
    int quantity = 0;

    // make sure there is text
    if (txtQuantity.Text.Trim().Length != 0)
    {
        quantity = int.Parse(txtQuantity.Text);

        if (((ShoppingCart)Session["cart"]).
            keyExists(int.Parse(productID.Text)))
        {
        //Here I should Destroy the current item that exists and replace with new one

        }
        else  // This is a new item
        {
            // Make the item
            OrderItem item = new OrderItem(
                int.Parse(productID.Text), productName.Text,
                double.Parse(productPrice.Text),
                int.Parse(txtQuantity.Text));
            // add to cart  
            ((ShoppingCart)Session["cart"]).addToCart(item);

        }
        // How does this work? Who is sender?
        this.btnReturn_Click(sender, e);
    }
    else
    {
        Response.Write("Nothing Ordered<br>You must order some of the product or return to the Catalog");
    }

これがOrderItemオブジェクトです

public class OrderItem
{
private int productID;
private string prodName;
private double unitPrice;
private int quantityOrdered;

private string exceptionStr;


public OrderItem(int id, string name, double price, int quantity)
{
    prodName = name;
    exceptionStr = "Numeric data must not be negative";
    if ( id < 0 || price < 0 || quantity < 0)
    {
        throw new System.ArgumentException(exceptionStr);
    }
    else
    {
        productID = id;
        unitPrice = price;
        quantityOrdered = quantity;
    }
}


#region Public Properties
public int ProductID
{
    get
    {
        return productID;
    }
}

public string ProductName
{
    get 
    {
        return prodName;
    }
}


public double UnitPrice
{
    get
    {
        return unitPrice;
    }
}


public int QuantityOrdered
{
    get
    {
        return quantityOrdered;
    }
    set
    {
        if( value < 0 )
        {
            throw new ArgumentException(exceptionStr);
        }
        else
        {
            quantityOrdered = value;
        }
    }
}

#endregion
}

これがあなたの閲覧のためのShoppingcartです:

 public class ShoppingCart : IEnumerable
 {
private SortedList theCart;

public ShoppingCart() {
    theCart = new SortedList();
} // end of Constructor


public bool HasItems {
    get{
        bool hasItems = false;
        if( theCart.Count > 0 )
            hasItems = true;
        return hasItems;
    }
    set {
        // ignore this is read only
    }
} // end of HasItems


public void addToCart(OrderItem item) {
    theCart.Add(item.ProductID, item);
}// AddToCaArt

/// <summary>
/// deletes item that is passed
/// </summary>
/// <param name="item"></param>
public void deleteFromCart(OrderItem item)
{
    theCart.Remove(item.ProductID);
} // end deleteFromCart

/// <summary>
/// deletes the item with this id key
/// </summary>
/// <param name="id"></param>
public void deleteFromCart(int id)
{
    theCart.Remove(id);
} // end deleteFromCart
public OrderItem[] getCartContents()
{

// need to create stuff
    OrderItem[] stuff = null;
    theCart.Values.CopyTo(stuff, 0);

    return (stuff);
} // end getCartContents


public bool keyExists(int ID) {

    return theCart.ContainsKey(ID);
}// end keyExists

public ICollection Values
{
    get
    {
        return theCart.Values;
    }
}

#region IEnumerable Members

public IEnumerator GetEnumerator()
{
    return theCart.GetEnumerator();
}

#endregion
}
4

4 に答える 4

1

クラスに、 (およびメソッド)というShoppingCartメソッドを追加できます。IncreaseQuantity(int productID)DecreaseQuantity

public void IncreaseQuantity(int productID)
{
   int indexOfProduct = theCart.IndexOfKey(productID);

   if(indexOfProduct != -1)
   {
       this.theCart[indexOfProduct].quantityOrdered++;
   }
}

次に、セッションからメソッドを呼び出します

ShoppingCart cart = (ShoppingCart)Session["cart"];

if (cart.keyExists(int.Parse(productID.Text)))
{
    //can store the parsed int in a variable instead to prevent...
    //having to parse twice.
    cart.IncreaseQuantity(int.Parse(productID.Text));    
}
于 2012-10-20T18:45:44.277 に答える
1

クラスまたはモデルレベルから、ショッピングカートがどのように見えるかを考えることを強くお勧めします。次のようなクラスのセットは大いに役立つと思います(最高ではありませんが、最初から問題のない設計です)。

[Serializable]
public class ShoppingCartItem
{
  public ShoppingCartItem(guid key, decimal price, int quantity)
  {
    this.Key = key;
    this.Price = price;
    this.Quantity = quantity;
  }

  public Guid Key { get; private set; }
  public Decimal Price { get; private set; }
  public int Quantity { get; set; }
}

[Serializable]
public class ShoppingCart
{
  public ShoppingCart()
  {
    this.Clear();
  }

  public ICollection<ShoppingCartItem> Items { get; private set; }

  public int ItemCount 
  {
    get { return this.Items.Sum(i => i.Quantity); }
  }

  public decimal Subtotal
  {
    get { return this.Items.Sum(i => i.Quantity * i.Price); }
  }

  public void Clear()
  {
    this.Items = new List<ShoppingCartItem>();
  }
}

これで、ShoppingCartは、ASP.Netセッションに格納できるように(またはウィッシュリストを作成するために)シリアル化できます:))

今、私は緩く型付けされたASP.Netセッションのファンではないので、覚えていないところから、この素晴らしいクラスを借りて、強く型付けされたSessionオブジェクトを作成しました。

using System;
using System.Web;

namespace Company.Product.Web.UI.Domain
{
    public abstract class SessionBase<T> where T : class, new()
    {
        private static readonly Object _padlock = new Object();

        private static string Key
        {
            get { return typeof(SessionBase<T>).FullName; }
        }

        public static T Current
        {
            get
            {
                var instance = HttpContext.Current.Session[Key] as T;

                if (instance == null)
                {
                    lock (SessionBase<T>._padlock)
                    {
                        if (instance == null)
                        {
                            HttpContext.Current.Session[Key] = 
                              instance = new T();
                        }
                    }
                }

                return instance;
            }
        }

        public static void Clear()
        {
            var instance = HttpContext.Current.Session[Key] as T;
            if (instance != null)
            {
                lock (SessionBase<T>._padlock)
                {
                    HttpContext.Current.Session[Key] = null;
                }
            }
        }

    }
}

この例で使用するには、次を作成します。

public class ShoppingCartSession : SessionBase<ShoppingCart> { }

次に、コード内のどこでも使用できます。

var item = ShoppingCartSession.Current.Items.FirstOrDefault(i => i.Key= key);

if (item == null)
{
  ShoppingCartSession.Current.Items.Add(
    new ShoppingCartItem(Key, price, quantity));
}
else
{
  item.Quantity = item.Quantity + quantity;
}

拡張可能で、やりたいことなどを実行できる、強く型付けされたセッションショッピングカートオブジェクト。また、アプリケーションの他の部分からアクセスして、カート内のアイテムの数とエリアの小計を表示することもできます。たとえば、アプリケーションの上部に、ショッピングカートのステータスの小さなプレビューを表示することができます。

于 2012-10-20T18:50:07.287 に答える
0

1つの方法は、すべてのOrderItemの一部として数量を維持し、個々のOrderItem数量を列挙して、ショッピングカーの総数を取得することです。ただし、各OrderItem IDは、ShoppingCartに1回だけ存在する必要があります。

たとえば、ShoppingCartに次のようなメソッドを追加します

    public OrderItem Retrieve(int id)
    {
        return theCart[id] as OrderItem;
    }

そして、カートに同じ商品IDがすでに含まれている場合

    OrderItem orderItem = cart.Retrieve(1);
    item.QuantityOrdered += 1;

最後に、更新されたカートオブジェクトをSession変数に割り当てます。

達成する別の方法は、ShoppingCartに別のOrderItemを追加し、OrderItemIdでグループ化されたカウントを維持することです。

于 2012-10-20T18:31:54.407 に答える
0

仕方がないと思います。

オブジェクトを再作成する必要があることであなたを悩ませているのは何ですか?
それはパフォーマンスですか、それともコードをクリーンに保ちますか?

パフォーマンスの問題である場合:次
のように、アイテムごとにセッションに個別のオブジェクトを保存することを検討してください-

int itemID = int.Parse(productID.Text);
int productQuantity = Session["item_number_" + itemID];

コードをクリーンに保つことが問題になる場合:すべてのロジックをプロパティに配置する
ことを検討してください。Session

public ShoppingCart SessionCart
{
    get
    {
        if (Session["cart"] == null)
            return new ShoppingCart();
        else
            return (ShoppingCart)Session["cart"];
    }
    set
    {
        Session["cart"] = value;
    }
}
于 2012-10-20T18:38:21.037 に答える