2017-02-24 109 views
0

我试图展示产品图片,但我有一个问题 显示图像,我觉得有很多我不明白理解的ASP.NET MVC基本概念

  • 我的第一步是显示每个产品的媒体,因为表已经有了一个外键MediaID,我认为我的模型对于这一步很好
  • 第二步是制作一个ProductMedia表或关联以便让产品有几张图片,主键将由productId和mediaId组成

我迷失在这2个步骤的中间,通常我的视图写入的方式我希望能够至少显示默认图片,每个产品必须具有的媒体列表中的第一个

当我在家庭控制器中放置一个断点时,我可以看到每个产品 都有一个mediaId,但我不知道在哪里以及如何将图片添加到介质列表中,因此毫不奇怪,该列表为空并且没有图像在我的任何产品

我的HomeController的

public ActionResult Index(string searchString) 
    { 
     var products = from p in dc.Products 
         select p; 

     .... 
     return View(products); 
    } 

这是我HomeIndex

@foreach (var p in Model) 
    { 
     <div class="col-lg-4 col-sm-4 hero-feature text-center"> 
      <div class="thumbnail"> 
       <a href="@Url.Action("Details", "Product", new { id = p.ProductID })" class="link-p" style="overflow: hidden; position: relative;"> 


        **@if (p.Medium.Count > 0) 
        { 
         <img src="@p.Medium.ElementAt(0).MediaUrl" alt="" style="position: absolute; width: auto; height: 257px; max-width: none; max-height: none; left: 1px; top: 0px;"> 
        }** 
       </a> 
       <div class="caption prod-caption"> 
        <h4><a href="@Url.Action("Details", "Product", new { id = p.ProductID })">@p.ProductName.Substring(0, 1).ToUpper()@p.ProductName.Substring(1).ToLower()</a></h4> 
        <p>@p.ProductDescription</p> 
        <p> 
        </p> 
        <div class="btn-group"> 
         <a href="#" class="btn btn-default">@p.Prices.OrderBy(pr => pr.PriceDate).FirstOrDefault().PriceValue</a> 
         @*     <a href="#" class="btn btn-primary"><i class="fa fa-shopping-cart"></i>Buy</a>*@ 
         @Html.ActionLink("Buy!", "Create", "Cart", new { id = p.ProductID, quantity = 1 }, new { @class = "btn btn-primary" }) 
        </div> 
        <p></p> 
       </div> 
      </div> 
     </div> 
    } 

介质是在产品 的模型中定义介质的列表中的每个产品都有数家媒体,它看起来像这样

public partial class Product 
     { 
      public Product() 
      { 

       .... 
       this.Medium = new HashSet<Medium>(); 
      } 

      public int ProductID { get; set; } 
      .... 
      public int MediaID { get; set; } 
      .... 

      public virtual ICollection <Medium> Medium { get; set; } 

     } 
+0

请注意,模型 - 视图 - 控制器标签是关于模式的问题。 ASP.NET-MVC实现有一个特定的标签。 –

回答

1

你并不需要定义ProductMedia因为你的关系似乎是1-many。

第三个表在许多关系中定义。每个产品有多个媒体,每个媒体都属于一个产品。

您的模型不需要MediaId,我认为它是默认图片的ID。

你需要做的就是拉每种产品的controller.Something内像这样的媒体:

public ActionResult Index(string searchString) 
{ 
    var products = dc.Products.ToList(); 

    foreach(p in products) 
    { 
     //I assume that your Medium table has a column named ProductID which is a foreign key to Product table 
     p.Medium = dc.Medium.Where(x => x.ProductID == p.ProductID).ToList(); 
    } 
    return View(products); 
} 

内,您的看法,改变评价if语句来此,以显示默认媒体您的产品:

@if (p.Medium != Null && p.Medium.Any()) 
{ 
     <img src="@p.Medium.First().MediaUrl" alt="" style="position: absolute; width: auto; height: 257px; max-width: none; max-height: none; left: 1px; top: 0px;"> 
} 
+0

感谢Efe,但我的媒体没有productID – bob

+0

因此,您无法将媒体与产品关联。在一对多关系中,依赖实体必须拥有独立实体的外键。在你的场景中,产品是独立的。也就是说,没有产品,媒体是没有意义的,但产品是独立的实体,不管它是否有媒体。将ProductId添加到媒体表格。如果您将媒体用于新闻或用户等其他实体,则应将NewId或UserId添加到媒体表中。 – Efe

+0

由于搞乱查询控制器代码是一个坏主意,我建议你为将来的项目使用实体框架AutoMapper – Efe