ASP.NET MVC从类型IEnumerable<cart&gt渲染部分视图;从类型IEnumerable<product&gt渲染内部视图。

问题描述 投票:0回答:1

编辑。 产品视图中包含一些产品,所以我想用一个按钮将它们一个个添加到购物车中,添加的产品将出现在部分视图(购物车)中的一个表格中,这个表格就是 顺利我现在想把这个购物车呈现在一个弹出式模式中,这样当我按下弹出式按钮时,它就会显示我添加的产品,而我还在产品视图中。

我试图在模态体中做这样的事情。

@Html.Partial("_ShowCart", new List<InternetApp.Models.Cart>())

但这样做的结果是一个空列表。

所以我想做这样的事情,但我不知道如何用不同的模型来做。

@Html.Partial("_ShowCart", Model)

我有3个模型:产品,购物车和视图模型。

public class Product
{
    public int id { get; set; }
    public String name { get; set; }
    public float price { get; set; }
    public String image { get; set; }
    public String description { get; set; }
    public int? CategoryId { get; set; }
}

public class Cart
{
    public int product_id { get; set; }
    public DateTime added_at { get; set; }
    public virtual Product product { get; set; }
}

public class ProductCart
{
    public Product Product { get; set; }
    public Cart Cart { get; set; }
}

购物车和产品各有一个控制器,我把购物车作为一个部分视图,它采用的是 IEnumerable<Cart> 和产品视图,其中包括 IEnumerable<Product>.

这是购物车索引动作

public ActionResult Index()
{
    List<Cart> Cart = db.Cart.Include(a => a.product).ToList();
    return PartialView("_ShowCart", Cart);
}

我不知道如何在产品内部渲染购物车,因为每个产品都有不同的功能,我不知道该怎么做。IEnumerable 模型...

asp.net-mvc asp.net-mvc-4 partial-views asp.net-mvc-partialview
1个回答
0
投票

你的实体框架(EF)模型会像下面这样。 我修改的目的只是为了建议标准化和清晰化。

public class Product
{
    [Key] //This is only needed by EF if you don't call the primary key "Id".
    public int Id { get; set; }
    public String Name { get; set; }
    public float Price { get; set; }
    public String Image { get; set; }
    public String Description { get; set; }
    //Add any additional properties.
}

public class Cart
{
    [Key]
    public int Id { get; set; }
    //Add any additional properties
}

public class CartProduct
{
    [Key]
    public int Id { get; set; }
    public int CartId {get; set; } //References Id property in Cart entity.
    public int ProductId {get; set; } //References Id property in Product entity.
    public DateTime AddedAt { get; set; }

    //These are navigation properties.  
    //The foreign key attribute lets EF know what property to reference
    [ForeignKey("CartId")]
    public virtual Cart Cart { get; set; }

    [ForeignKey("ProductId")]
    public virtual Product Product { get; set; }
}

你应该创建一个单独的模型集。 EF模型应该只用来表示你的数据库表和属性。 将这些模型与你的EF模型分开......也许是一个ViewModel文件夹。

    public class CartProductsViewModel
    {
        public int CartId { get; set; } //Persist the cart you are adding to.
        public IEnumerable<ProductModel> Products {get; set; } //Available products

        public class ProductModel
        {
            public int Id { get; set; }
            public String Name { get; set; }
            public float Price { get; set; }
            public String Image { get; set; }
            public String Description { get; set; }
            //Add any additional properties.
         }

    }

现在你可以有一个控制器和一个视图。

public ActionResult Index(int cartId) //passing cartId for cart you are working with.
{
    var viewModel = new CartProductsViwModel();

    viewModel.CartId = cartId;
    //Get available products that you can add to cart.
    viewModel.Products = db.Products //pluralized in DbSet in EF context.
                  .Select(p => new ProductModel
                     { 
                        Id = p.Id,
                        Name p.Name,
                        Price = p.Price,
                        Image = p.Image
                        Description = p.Description
                     });

    return View(viewModel);  
}

在返回中,我没有指定viewModel的名称。 只有当你遵循MVC准则,并将视图命名为与方法调用相同的名称时,这才有可能,在本例中,index.cshtml。 同时在顶部添加以下内容。

@model CartProductsViwModel //may need to be fully qualified (add namespace).

你应该能够循环浏览这个模型中的产品,并在表格中显示出来。 这样就避免了要处理一个单独的产品和购物车视图。 至于将产品添加到视图中,这可以在客户端完成。 我建议先试着把这个工作做好,然后你可以创建一个新的问题,专门负责客户端的工作。

如果你真的需要对话框,你可以查一下JQuery对话框。JQuery UI对话框

然后你需要执行ajax调用来发布添加的产品和cartId。 该方法将是这样的。

[HttpPost]
public JsonResult AddProductToCart(int cartId, ProductModel product) {}

这也将是一个单独的问题。 我希望这能帮助你入门。

© www.soinside.com 2019 - 2024. All rights reserved.