如何在C#中返回和检索对象值?

时间:2017-02-25 16:58:55

标签: c# asp.net-mvc

我正在为我的项目使用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中检索该对象

由于

1 个答案:

答案 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,尤其是如果参数来自最终用户。