我正在为我的项目使用3层架构。但是对于一个实例,我需要从方法返回Object并检索值。 这是我的两个模型:
public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal Price { get; set; }
}
public class Item
{
public Product Products { get; set; }
public int Quantity { get; set; }
}
我的方法是:
public class ProductGateway{
public List<Product> GetProductByProductId(int productId)
{
List<Product> productList = new List<Product>();
SqlConnection connection = new SqlConnection(ConnectionString);
string query = "SELECT ProductName,cast(Price as decimal(10,2)) as Price FROM Product WHERE ProductId='" + productId + "' ";
SqlCommand command = new SqlCommand(query, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Product product = new Product();
product.ProductName = reader["ProductName"].ToString();
product.Price = (decimal)reader["Price"];
productList.Add(product);
}
return productList;
}
}
和我的控制器: CartController
ProductGateway gateway=new ProductGateway();
public ActionResult BuyProduct( int id)
{
if (Session["cart"]==null)
{
List<Item> cart= new List<Item>();
cart.Add(new Item()
{
Products = gateway.GetProductByProductId(id),// this line getting an error(no list)
Quantity = 1
});
Session["cart"] = cart;
}
我的cshtml视图:
@{
var cart = (List<Item>) Session["cart"];
}
@foreach (var item in cart)
{
<tr>
<td class="cart_product">
<a href="@Url.Action("ProductDetails", "Product", new { id = item.Products.ProductId })">@item.Product.Price </a>// an error occurred on ProductId and Price
现在的问题是我的返回类型是List控制器在Products = gateway.AllProductsByProductId(id)
上获取错误并要求将项目模型更改为Public List<Product> Products
。因此我想从GetProductByProductId发送Object以避免Cart Controller中的错误。有没有办法解决这个问题,或者我需要更改整个代码?我真的对这种情况感到困惑。
我的要求
1.我需要在我的cshtml视图中使用@item.Product.Price
等产品属性。 (当前错误:无法解析符号Price
)
2.因此我的网关应该返回一个Product对象而不是Porduct列表(现在是网关产品返回列表)。
第3。如果可以从网关返回Object(假设网关为每个id返回单个产品),那么如何从Cart Controller中检索该对象
由于
答案 0 :(得分:0)
在您的评论中,您表示只有一个产品可以与给定产品ID一起存在。在这种情况下,您的GetProductByProductId(int productId)
应该返回一个产品。对方法进行以下更改:
public Product GetProductByProductId(int productId)
{
// your code
// Change this part
if(reader.Read())
{
Product product = new Product();
product.ProductName = reader["ProductName"].ToString();
product.Price = (decimal)reader["Price"];
return product;
}
// not found so we can return null or whatever you want
return null;
}
您还应该尝试使用SqlParameter
来避免SQL Injection,尤其是如果参数来自最终用户。