在mvc实体框架中加载多对多数据到视图模型

本文关键字:多数据 视图 模型 加载 mvc 实体 框架 | 更新日期: 2023-09-27 18:13:42

View Model

public class ItemDetail
{
    public IEnumerable<DescriptionTag> DescrptionsTags { get; set; } //many to many join table
    public IEnumerable<Item> Items { get; set; }
}
控制器动作

public ActionResult Index(int? id)
    {
        ItemDetail viewModel=new ItemDetail();
        viewModel.Items = db.Items.Include(i=>i.DescriptionTags); //eager loading related data
        if (id != null)
        {
            viewModel.DescrptionsTags = viewModel.Items.Where(i => i.ID == id.Value).Single().DescriptionTags; // loads the description tags to viewmodel property
        }

        return View(viewModel);
    }
视图

@foreach (var item in Model.Items) {
<tr>
    <td>
        @Html.DisplayFor(modelItem=>item.ID)
    </td>
    <td>
        @*Loading tags in the table*@
        @if (Model.DescrptionsTags != null)
        {
            foreach (var tag in item.DescriptionTags)
            {
                <a>@tag.Description.DescriptionName</a>
            }
        }
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Size)
    </td>  
    <td>
        @Html.ActionLink("Select", "Index", new { id=item.ID}) |
        @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
        @Html.ActionLink("Details", "Details", new { id=item.ID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.ID })
    </td>
</tr>
}

细节:

代码工作正常。问题是,直到用户单击选择链接或第一次加载页面时,标签才被加载到表中。也就是说,只有当id传递给控制器时,表才会加载标签。这不是我想要的。有没有一种方法,我可以加载标签,而不需要传递id?

我想做的是类似于Stackoverflow中的标签。每个帖子有许多标签,每个标签可以有许多帖子。我需要的是,在一个表列中,我想加载与该行的特定项目id相关的所有标记。

我目前正在遵循这个链接的教程- http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application。但上面的代码是我自己基于教程的版本。所以,可能有一种完全不同的方法来做我正在尝试的事情。

在mvc实体框架中加载多对多数据到视图模型

我不确定我是否知道你想做什么,但你不需要条件来加载你的控制器上的标签。这将是有用的看到你的项目模型,因为我猜它应该包括一个导航属性DescriptionTags。你试过这个吗?:

 public ActionResult Index(int? id)
 {
        ItemDetail viewModel=new ItemDetail();
        viewModel.Items = db.Items.Include(i=>i.DescriptionTags); //eager loading
        related data

    return View(viewModel);
}

解决。控制器中的foreach循环完成了这项工作。

ItemDetail viewModel=new ItemDetail();
viewModel.Items = db.Items.Include(i=>i.DescriptionTags);
foreach(Item i in viewModel.Items)
{
    viewModel.DescrptionsTags = i.DescriptionTags;
}