2017-02-25 66 views
-3

我正在爲我的項目使用3層體系結構。但是對於一個實例,我需要從一個方法返回Object並檢索值。 這裏是我的兩個型號:如何在C#中返回並檢索對象值?

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 

現在的問題是,我的返回類型列表中選擇控制器上Products = gateway.AllProductsByProductId(id)得到一個錯誤,並要求變更項目模型Public List<Product> Products。因此我想從GetProductByProductId發送對象,以免在車控制器錯誤。有沒有辦法解決這個問題,或者我需要更改整個代碼?我真的很困惑這種情況。

我的要求

1.I需要在我CSHTML視圖中使用的產品屬性,如@item.Product.Price。 (現在的錯誤:無法解析符號Price

2.So我的網關應該返回一個產品對象,而不是Porduct的列表(產品現在網關返回列表)。

3.如果可以從網關返回對象(假設網關返回每個ID單品),那麼我怎麼能檢索對象從車控制

感謝

+0

是什麼'AllProductsByProductId'?你已經顯示了另一種方法,但是你正在調用這個方法。 – CodingYoshi

+0

@CodingYoshi編輯 –

+0

爲什麼要退從'GetProductByProductId(INT productId參數)''一個List'?你有多個產品具有相同的'productId'?我懷疑是這樣。因此,返回一個產品,然後您可以在您的視圖中使用該產品。 – CodingYoshi

回答

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特別是如果該參數從最終用戶的到來。

+0

非常感謝你,我會繼續關注SQl Injection。@ CodingYoshi –