【问题标题】:Loading many to many data into viewmodel in mvc entity framework在 mvc 实体框架中将多对多数据加载到视图模型中
【发布时间】:2014-07-21 06:20:35
【问题描述】:

查看模型

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。 但是上面的代码是我自己根据教程做的版本。所以,可能有一种完全不同的方式来做我正在尝试的事情。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework model-view-controller many-to-many


    【解决方案1】:

    我不确定我是否知道您要做什么,但您不需要条件来在控制器上加载标签。查看您的项目模型会很有用,因为我猜它应该包含一个导航属性 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);
    }
    

    【讨论】:

    • 感谢您的回复。如果我不加载标签,那么标签将不会加载到我的视图模型属性-'DescriptionTags'。
    • 您的答案不会在视图模型属性“DescriptionTags”中加载描述名称。我想做的类似于 Stackoverflow 中的标签。每个帖子都有很多标签,每个标签可以有很多帖子。我需要的是,在表格单元格中,我想加载与特定项目 ID 相关的所有标签。我试图通过'viewModel.DescrptionsTags = viewModel.Items.Where(i => i.ID == id.Value).Single().DescriptionTags;'来做到这一点。但为此,需要传递控制器参数。因为,在第一次加载时,没有传递参数,所以标签列是空白的。
    • 抱歉,我还是迷路了,您想将与您所有文章相关的所有标签加载到单独的表格中吗?显然,如果你在加载标签之前有 if (id != null),如果你没有,它们就不会出现,并且 id...你能包括一个你想要的模型布局吗?
    • 是的,你是对的。实际上我想要的是即使没有 id 也能加载标签。例如,页面首次加载时没有 id,因为没有参数将传递给控制器​​。不过,我想通了。我在视图模型上使用了 foreach。你可以看看我的回答。也许你会明白我想做什么。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2013-08-07
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多