我正在关注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为空,但一直未能找到正确的设置方法。和任何初学者问题一样,我想我做错了什么或者错过了明显的问题。欢迎任何帮助。
由于
答案 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; }
...
有帮助吗?