返回我的Session [“cart”]中所有项目的部分视图的操作

时间:2012-10-30 23:49:45

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-partialview

使用Ajax,我可以在我的操作AddToCart中将ProductID添加到我的购物车列表。

这是代码:

public ActionResult AddToCart(int productID)
{
    List<int> cart = (List<int>)Session["cart"];
    if (cart == null){
       cart = new List<int>();
    }
    cart.Add(productID);

    Session["cart"] = cart;

    return new JsonResult() { Data = new { Status = "Success" } };
}

在我的存储库中,我使用以下LINQ方法通过ID获取产品的详细信息:

public Products GetProductByID(int id)
{
    return db.Products.SingleOrDefault(s => s.Id == id);
}

产品具有名称,描述和价格作为属性。

我有一个用于模型绑定的ViewModel:

public class ProductsViewModel
{
    public string Description { get; set; }
    public string Name { get; set; }
    public double price { get; set; }
    public string Image { get; set; }
    public int ProductId { get; set; }
}

我有另一个Viewmodel来保存这个ProductsViewModel,它是我用foreach循环的ProductList:

public class HomeIndexViewModel
    {
        public List<ProductsViewModel> Productlist { get; set; }
    }

现在我需要创建一个动作,即ShoppingCart,它应该返回Session [“cart”]中所有项目的局部视图。所以我可以在我的视图中使用产品详细信息显示它们

动作不需要任何参数。它只会查看会话并返回一个包含所选产品列表的模型。

我100%肯定的是,在ShoppingCart View中,我将100%使用以下代码行:

@model AvanShop.ViewModels.HomeIndexViewModel

然后执行一个看起来像这样的foreach循环:

 @foreach (var item in Model.Productlist)
            {
             code to display the products that are inside the cart  
            }

这是关于我如何使用Action索引显示我的索引视图中的所有产品的示例。

public ActionResult Index()
        {
            var Productlist = repository.GetAllProducts();
            var model = new HomeIndexViewModel()
            {
                Productlist = new List<ProductsViewModel>()
            };

            foreach (var Product in Productlist)
            {
                FillProductToModel(model, Product);
            }
            return View(model);
        }

private void FillProductToModel(HomeIndexViewModel model, ProductImages productimage)
{
    var productViewModel = new ProductsViewModel
    {

        Description = productimage.Products.Description,
        ProductId = productimage.Products.Id,
        price = productimage.Products.Price,
        Name = productimage.Products.Name,
        Image = productimage.ImageUrl,
    };
    model.Productlist.Add(productViewModel);
}

我不知道如何做到这一点,感谢任何提示或帮助

1 个答案:

答案 0 :(得分:1)

注意:我建议将此操作称为ShoppingCart,而不是GetShoppingCart;对MVC的惯例更好,但这是一个小问题而不是必需的。

public ActionResult GetShoppingCart()
{
    var cart = Session["cart"] as List<int>;

    var products = cart != null ? cart.Select(id => 
             {
                 var product = GetProductById(id);
                 return new ProductsViewModel
                    {
                       Name = product.Name,
                       Description = product.Description,
                       price = product.Price
                    }
             }) : new List<ProductsViewModel>();

    return PartialView(products);
}

您的观点(我假设您使用的是Razor观点),Views/{your controller name}/GetShoppingCart.cshtml

@model IEnumerable<ProductsViewModel>

@if(Model.Any())
{
   The following items are in your cart:
   <ul>
   @foreach(var product in Model)
   {
      <li>@product.Name - @product.Price.ToString("{0:C}")</li>
   }
   </ul>
}
else
{
   You have no items in your shopping cart.
}