在asp.net MVC中使用Join查询

时间:2014-09-21 20:25:26

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我正在关注MVC音乐商店的教程,并试图在它上面构建。我希望能够为类别中的每个项目显示图像。到目前为止,我可以返回一个类别的项目列表,但是无法从数据库中获取URL以在我的视图中填充图像源。

我设置模型的方式如下。我有一个项目表,其中包含Category表的外键。然后我有一个Image表,它有一个项目表的外键。我一直在尝试从控制器返回的每个项目的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()" />
        }

当我单步执行上面的代码时,我可以看到图像URL为空,但一直未能找到正确的设置方法。和任何初学者问题一样,我想我做错了什么或者错过了明显的问题。欢迎任何帮助。

由于

1 个答案:

答案 0 :(得分:3)

首先,模型中的@item.Image.Wher...中有一个拼写错误Images(复数)。其次,你试图显示:

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

FirstOrDefault() reteruns null或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; }
...

有帮助吗?