です。
まず、コードはSQLインジェクション攻撃に対して脆弱です。あなたは文字列を連結してSQLクエリを形成します。誰かがボタンのコマンド引数を操作してその値が1; update products set price = 0;
になったらどうなりますか?彼らはちょうどあなたのシステム上でコードを実行することができました!これを修正する方法は、パラメータ化されたクエリを使用することです。
もう1つの問題は、商品の価格情報をクライアントのCookieに保存していることです。それは危険だと思いませんか?少しのノウハウしか持たないクライアントであれば、すべての製品の費用が0になるようにクッキーを変更できます。代わりに、製品IDと数量をクッキーに格納してから、商品名と価格を取得してください。
あなたのコード「Addtocart」には魔法の文字列があります。これまでに更新したい場合は、複数の場所で変更する必要があります。代わりに、定数を作成し、必要な場所でその定数を参照してください。次に、更新する必要がある場所は1つだけです。
データテーブルの使用が不適切です。彼らは、POCO(Plain Old C#Objects)や "モデル"クラスを使用するよりも、大量のメモリを使い果たしてしまいます。
データをカスタム形式でクッキーに保存しています。これは、クッキーからデータを取り戻したいときに解析するのに苦労するでしょう。代わりに、JSONなどの単純な形式を使用してください。
あなたは文字列として商品価格を保管しています。それをしないでください!あなたは文字列で数学をすることはできません。お金を使って作業する場合は、decimal
タイプを使用してください。
コードをインデントします。それははるかに簡単に読むことができます。
まず、私たちは私たちの製品を表すクラスを作成します:
はここで、これらの問題を修正、あなたの更新されたコードです。価格はタイプdecimal
であることに注意してください。
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
このクラスは、製品に関するデータベースからデータを取得するための集中化された場所として機能します。
public class ProductRepository
{
private readonly string _connectionString;
public ProductRepository(string connectionString)
{
_connectionString = connectionString;
}
public Product GetProductById(string productId)
{
using(var connection = new SqlConnection(_connectionString))
{
// I'm going to use Dapper here because it's super handy
// https://github.com/StackExchange/Dapper
var product = connection.QueryOne<Product>(
@"select
Id,
Name,
Price
from
products
where
Id = @ProductId",
new { ProductId = productId });
return product;
}
}
}
これらの2つのクラスは、ユーザーが購入したい特定の製品とその数量を表します。これは、価格情報が含まれていないため、安全に保存することができます。
public class CartItem
{
public string ProductId { get; set; }
public int Quantity {get; set; }
}
public class Cart
{
public Dictionary<string, CartItem> Items { get; set; }
public Cart()
{
Items = new Dictionary<string, CartItem>();
}
}
この定数は、中央のある場所に配置する必要があります。
ページの実際のロジックのための今
public constant string ShoppingCartCookieName = "Cart";
:私はカートロジックにアドインをリファクタリング行ってしまった時点で、私は実際にデータベースの呼び出しを行う必要はありませんでしたことを
protected void btnAddtoCart_Click(object sender, EventArgs e)
{
var addToCartButton = (Button)sender;
// notice I don't call .ToString() below
// because Button.CommandArgument is already a string
var productId = addToCartButton.CommandArgument;
var cart = GetShoppingCartFromCookie();
if(cart.Items.ContainsKey(productId)
{
//their cart already contained this product, so let's bump the quantity
cart.Items[productId].Quantity += 1;
}
else
{
//their cart didn't contain this product, so we'll add it
var cartItem = new CartItem { ProductId = productId, Quantity = 1 };
cart.Items.Add(cartItem.ProductId, cartItem);
}
SaveShoppingCartToCookie(cart);
}
private void SaveShoppingCartToCookie(Cart cart)
{
var cartJson = JsonConvert.SerializeObject(cart); //using Newtonsoft.Json
Response.Cookies[ShoppingCartCookieName].Value = cartJson;
Response.Cookies[ShoppingCartCookieName].Expires = DateTime.Now.AddHours(1);
}
private Cart GetShoppingCartFromCookie()
{
if (Request.Cookies[ShoppingCartCookieName] == null)
{
return new Cart();
}
else
{
var existingCartJson = Response.Cookies[ShoppingCartCookieName].Value;
// you may wish for some logic here to make sure the JSON can be converted
// to a Cart since a user could have modified the cookie value.
var cart = JsonConvert.DeserializeObject<Cart>(existingCartJson);
return cart;
}
}
お知らせ製品に関する情報を入手してください。今すぐより速く走り、より効率的になるでしょう。