1

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

我有我的模型,其中包含我希望在一页上显示的两个表。这些表是产品和供应商。

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

在控制器中,我创建了一个包含数据的 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; }
    }
}

家庭控制器.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>
        }

提前致谢!

4

3 回答 3

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>用作视图的模型,遍历它们并使用Producta 上的导航属性Supplier来获取有关产品的信息。

于 2013-10-18T09:34:58.297 回答
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>
}
于 2013-10-18T09:40:39.377 回答
0

您在 ProductWithSupplier 中定义了两个IEnumerables,因此当您遍历您的每个 type 时,List<ProductWithSupplier>您的每个itemtypeProductWithSupplier都包含两个 enumerables,您不能使用item.Products.title,因为item.Productsis of type IEnumerable<Product>

你应该做的是foreach在你的第一个里面再放一个,检查supplier.ProductID,添加类型而不是var,等等:

@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,请更改您的ProductWithSupplierto removeIEnumerable<>周围的 Product ,然后删除第二个foreach,直接使用item.Product

于 2013-10-18T09:42:28.510 回答