2014-09-21 108 views
0

我正在關注MVC音樂商店的教程,並試圖構建它。我希望能夠爲類別中的每個項目顯示圖像。到目前爲止,我可以返回一個類別的項目列表,但無法從數據庫獲取URL來填充我的視圖中的圖像源。在asp.net MVC中使用Join查詢

我設置模型的方式如下。我有一個項目表,其中包含到分類表的外鍵。然後我有一個圖像表,其中有一個外鍵到項目表。我一直在試圖從控制器返回的每個項目的url表中獲取一個url。

分類型號:分類

public class Category 
{ 
    public int CategoryId { get; set; } 
    public string CategoryName { get; set; } 
    public ICollection<Item> Items { get; set; } 
} 

產品型號的只是一個列表:包含外鍵的類別

public class Item 
{ 
    public int ItemId { get; set; } 
    public int CategoryId { get; set; } 
    public string ItemName { get; set; } 

    public virtual Category Category { get; set; } 
    public ICollection<Image> Images { get; set; } 
} 

圖片型號:包含一個外鍵的項目表。

public class Image 
{ 
    public int ImageId { get; set; } 
    public string ImageURL { get; set; } 
    public int ItemId { get; set; } 
    public virtual Item Item { get; set; } 
} 

瀏覽器

public ActionResult Browse(string category) 
{ 
var categoryModel = storeDB.Categorys.Include("Items") 
        .SingleOrDefault(c => c.CategoryName == category); 

return View(categoryModel); 
} 

查看:

@model Project.Models.Category 

<div class="items"> 
    <h3><em> @Model.CategoryName </em></h3> 

     @foreach (var item in Model.Items) 
     { 
      <a href="@Url.Action("Details",new {id = item.ItemId})"/> @item.ItemName 
      <a href="@Url.Action("Details",new {id = item.ItemId})"/> <img alt="@item.ItemName" src= "@item.Image.Where(i => i.ImageURL.Contains("thumb")).FirstOrDefault()" /> 
     } 

當我通過代碼上面,我可以看到,圖片網址是空的,但一直沒有弄清楚正確的方法來設置它。就像任何初學者的問題一樣,我想像我做錯了什麼或錯過了顯而易見的事情。任何幫助將受到歡迎。

由於

+0

問題的標題是誤導性的...... – Daniel 2014-09-22 23:50:44

+0

裸露在心我不知道我的問題是什麼。你會建議什麼? – ricky89 2014-09-23 11:11:25

回答

3

首先有鑑於@item.Image.Wher...在模型一個錯字是Images(複數)。其次,您要顯示:

<img alt="@item.ItemName" src= "@item.Images.Where(i => i.ImageURL.Contains("thumb")).FirstOrDefault()" /> 

FirstOrDefault() reteruns空或Image例如它們都不是路徑圖像。

你應該先檢查是否對象不是null url是不是空的,並顯示Image.ImageURL後:

@{var image = item.Images.Where(i => i.ImageURL.Contains("thumb")).FirstOrDefault();} 
if (image != null && !String.IsNullOrEmpty(image.ImageURL)) 
{ 
    <img alt="@item.ItemName" src="@image.ImageURL" /> 
} 
else 
{ 
    <img alt="@item.ItemName" src="~/default/image/path" /> 
} 

要啓用延遲加載,你可以在模型中使用虛擬關鍵字befor ICollection

... 
public virtual ICollection<Image> Images { get; set; } 
... 
public virtual ICollection<Item> Items { get; set; } 
... 

它有幫助嗎?

+0

非常感謝。它正在工作。 – ricky89 2014-09-22 23:03:13