【问题标题】:Using Join queries in asp.net MVC在 asp.net MVC 中使用 Join 查询
【发布时间】:2014-09-22 05:36:44
【问题描述】:

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

我设置模型的方式如下。我有一个项目表,其中包含 Category 表的外键。然后我有一个 Image 表,它有一个指向 item 表的外键。我一直在尝试从 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 为空,但一直未能找出正确的设置方法。与任何初学者问题一样,我想我做错了什么或错过了显而易见的事情。欢迎任何帮助。

谢谢

【问题讨论】:

  • 问题的标题有误导性...
  • 记住我不确定我的问题是什么。你有什么建议?

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


【解决方案1】:

首先,模型中的视图@item.Image.Wher... 中有一个错字是Images(复数)。其次,您正在尝试显示:

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

FirstOrDefault() 重新运行 null 或 Image 的实例,它们都不是图像的路径。

您应该首先检查对象是否为空且 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" />
}

要启用延迟加载,您可以在模型中为 ICollection 使用 virtual 关键字:

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

有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多