在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。但上面的代码是我自己基于教程的版本。所以,可能有一种完全不同的方法来做我正在尝试的事情。
我不确定我是否知道你想做什么,但你不需要条件来加载你的控制器上的标签。这将是有用的看到你的项目模型,因为我猜它应该包括一个导航属性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;
}