如何在View中使用复杂的ViewModel?

时间:2013-10-18 09:30:16

标签: c# asp.net-mvc

我是.Net MVC的新手,我正在努力解决以下问题。

我的模型包含两个我希望在一个页面上显示的表格。表格是产品和供应商。

我创建了一个ViewModel,它包含两个枚举表。

在Controller中,我创建了一个包含数据的List对象。

我遇到的问题是在我需要 item.Product.ID

时定义视图中的字段,即仅 item.Product 可用

请参阅下面的代码:

Product.cs - 由实体框架生成

namespace MyApp
{
    using System;
    using System.Collections.Generic;

    public partial class Product
    {
        public Product()
        {
            this.Suppliers = new HashSet<Supplier>();
        }

        public int ID { get; set; }
        public string title { get; set; }
        public string img { get; set; }
        public string description { get; set; }

        public virtual ICollection<Supplier> Suppliers { get; set; }
    }
}

Supplier.cs - 由实体框架生成

namespace MyApp
{
    using System;
    using System.Collections.Generic;

    public partial class Supplier
    {
        public int ID { get; set; }
        public string name { get; set; }
        public int productID { get; set; }
        public decimal price { get; set; }

        public virtual Product Product { get; set; }
    }
}

ProductWithSupplier.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace MyApp
{
    public class ProductWithSupplier
    {
        public IEnumerable<Product> Products { get; set; }
        public IEnumerable<Supplier> Suppliers { get; set; }
    }
}

HomeController.cs

public ActionResult Index()
{
        var p = from product in _db.Products
                        select product;

        var s = from supplier in _db.Suppliers
                        select supplier;

        var model = new List<MyApp.ProductWithSupplier> { new ProductWithSupplier()
            {
                Products = p,
                Suppliers = s
            }
        };

        return View(model);
}

Index.cshtml - 这就是问题所在。我无法指定Product.ID,Product.title,Product.img,Product.price和Supplier.name

@model List<MyApp.ProductWithSupplier>

@{
    ViewBag.Title = "Home Page";
}

        @foreach (var item in Model) {

        <div class="product @Html.Raw(item.Products.size)">
            <div class="media">
                <a href="product.html" title="product title">
                    <img src="@Html.Raw(item.Products.img)" alt="product title" data-img="product-1" />
                </a>            
            </div>
            <div class="details">
                <p class="name"><a href="product.html">@Html.Raw(item.Products.title)</a></p>
                <p class="price"><span class="cur">&pound;</span><span class="total">@Html.Raw(item.Products.price)</span></p>
            </div>
            <div class="details-supplier" id="details-@Html.Raw(item.Products.ID)">
                @foreach (var supplier in Model) {
                    <p>@supplier.Suppliers.name</p>
                }
            </div>
        </div>
        }

提前致谢!

3 个答案:

答案 0 :(得分:0)

视图模型的类型为List<MyApp.ProductWithSupplier>,但在单个ProductWithSupplier内,您定义了ProductSupplier的集合。我想你想使用ProductWithSupplier作为视图的模型,并遍历产品和供应商。

@model ProductWithSupplier

ViewModel应包含一个产品,其中包含多个供应商来表示您的数据结构:

public class ProductWithSupplier // this should be ProductWithSuppliers I guess.
{
    public Product Products { get; set; }
    public IEnumerable<Supplier> Suppliers { get; set; }
}

您必须相应地更改控制器。

也可以使用IEnumerable<Supplier>作为视图的模型,迭代它们并使用Product上的Supplier导航属性来获取有关该产品的信息。

答案 1 :(得分:0)

使用下面的东西,我没有尝试过,但同样的情感为我工作

@model IEnumerable<MyApp.Supplier>

,您将能够访问product.item,product.id等

@foreach (var item in Model) {
    <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Products.id) // to access properties of products
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name) // to access properties of suppliers
            </td>


        </tr>
}

答案 2 :(得分:0)

您在ProductWithSupplier中定义了两个IEnumerable,因此当您遍历List<ProductWithSupplier>时,每个item类型ProductWithSupplier包含两个枚举,您就不能使用item.Products.title,因为item.Products的类型为IEnumerable<Product>

您应该做的是在第一个foreach内添加var,检查供应商.ProductID,添加类型而不是@model List<MyApp.ProductWithSupplier> @{ ViewBag.Title = "Home Page"; } @foreach (MyApp.ProductWithSupplier item in Model) { @foreach (Product product in item.Products) { <div class="product @Html.Raw(item.Products.size)"> <div class="media"> <a href="product.html" title="product title"> <img src="@Html.Raw(item.Products.img)" alt="product title" data-img="product-1" /> </a> </div> <div class="details"> <p class="name"><a href="product.html">@Html.Raw(item.Products.title)</a></p> <p class="price"><span class="cur">&pound;</span><span class="total">@Html.Raw(item.Products.price)</span></p> </div> <div class="details-supplier" id="details-@Html.Raw(item.Products.ID)"> @foreach (Supplier supplier in item.Suppliers) { @if (supplier.productID == product.ID) { <p>@supplier.name</p> } } </div> </div> } } ,依此类推:

Product

如果您只需要一个ProductWithSupplier,请更改IEnumerable<>以删除产品周围的foreach,然后直接使用item.Product删除第二个{{1}}。< / p>