【问题标题】:MVC, Passing count of 3 tables to viewMVC,通过 3 个表的计数来查看
【发布时间】:2012-08-05 01:44:11
【问题描述】:

我正在尝试将三个不同表的计数与专辑列表一起传递到视图中。它是 MvcMusicStore 教程的一个模组。我收到“ObjectContext 实例已被处置,无法再使用...”错误。我知道它与延迟加载有关,但我不知道如何使它工作。

// Controller
public class StoreManagerController : Controller
{
    private MusicStoreDBEntities context = new MusicStoreDBEntities();  

    public ActionResult Index()
    {
        // counts
        ViewData["artistCount"] = context.Artists
                                     .Select(e => new { e.ArtistId }).Count();
        ViewData["genreCount"] = context.Genres
                                     .Select(e => new { e.GenreId }).Count();
        ViewData["albumCount"] = context.Albums
                                     .Select(e => new { e.AlbumId }).Count();

        // also tried two other ways...same result. 
        //ViewData["artistCount"] = context.Artists
                                 .Select(e => new { e.ArtistId }).ToList().Count;
        //ViewData["artistCount"] = context.Artists
                                 .Select(e => new { e.ArtistId }).ToList().Count();

        // album list
        var albums = context.Albums.Include(a => a.Genre).Include(a => a.Artist);
        return View(albums.ToList());
    }
}


// View - Index.cshtml  
@model IEnumerable<MVC_App1.Models.Album>
<div>
<label><strong>Database Counts:</strong></label>
    Albums: @ViewData["albumCount"] ...
    Artists: @ViewData["artistCount"]  ...
    Genres: @ViewData["genreCount"]
</div>  

<table>
@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Genre.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Artist.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Title)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Price)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.AlbumArtUrl)
    </td>
</tr>
}
</table>

解决方案:

所以我接受了添加新模型的建议。

public class AlbumsCollection 
{
    public IEnumerable<Album> Albums = new List<Album>();
    public IEnumerable<Artist> Artists = new List<Artist>();
    public IEnumerable<Genre> Genres = new List<Genre>();
}

然后在视图中进行计数。我意识到无论如何我都会将整个专辑列表传递给视图,因此那里并没有放缓。对于艺术家和流派……反正不会有很多,因为它们是一对多的关系。我想这就是放弃在控制器中进行计数....但我想这已经足够了。

【问题讨论】:

  • 我很惊讶使用 ToList 不起作用。你确定你尝试过.ToList.Count() 吗?这有效地运行查询并将其返回到内存中的列表。在将结果存储到 ViewData 之前将结果存储在可枚举中。并逐步检查代码以确保它实际上正确存储了它。
  • 令我惊讶。我只是仔细检查了这样做,同样的错误。

标签: c# asp.net-mvc linq


【解决方案1】:

我会创建一个新模型:

public class AlbumsCollection
{
    public IEnumerable<Album> Albums = new List<Album>();

    //Popular albums 
    //Newest albums 
    //etc
}

public class Album
{
    public int ArtistID;
    public int GenreId;
    public int AlbumId;
}

在控制器中填充该模型:

public class StoreManagerController : Controller
{
    private MusicStoreDBEntities context = new MusicStoreDBEntities();  

    public ActionResult Index()
    {
        AlbumsCollection albumsCollection = new AlbumsCollection();

        albumsCollection.Albums = context.Albums;

        return View(albumsCollection);
    }
}

那么你可以在你的视图中使用它:

@model Models.AlbumsCollection
<div>
<label><strong>Database Counts:</strong></label>
    Albums: @Model.Albums.Count ...
    Artists: @Model.Albums.Count(album => album.ArtistID != -1)  ...
    Genres: @Model.Albums.Count(album => album.GenreID != -1)
</div>  

<table>
@foreach (var item in Model.Albums) {
<tr>
    <td>
       @Html.DisplayFor(modelItem => item.Genre.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Artist.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Title)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Price)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.AlbumArtUrl)
    </td>
</tr>
</table>

(假设流派和艺术家是 ID)

【讨论】:

  • 我考虑过......但我认为将整个集合传递给视图并在那里计数它们会很糟糕。似乎它会比我需要的更多。是否可以在控制器中获取 Count,并将该数字传递给视图?
  • 是的,我建议不要在模型中包含专辑集合,而是添加三个变量整数作为计数。然后在控制器中设置这些。然后在视图中使用 Model.ArtistCount 访问它们,并且在 Controller Index 函数中初始化上下文无关紧要。
  • 至于你的错误,我相信上下文没有被初始化?如果在索引的开头为您放置 MVC 应该初始化 context.Albums.ToList();
  • 不完全在那里。所有计数始终是相同的数字。
    数据库计数:专辑:3 ...艺术家:3 ...流派:3。让我尝试在模型中指定 3 个整数,而不是使用 @Model.Albums.Count(album => album.ArtistID != -1)
  • 不,我使用了一个包含 int AlbumCount 等的新模型……但是当我尝试在控制器中设置这些模型时,同样的错误。 AlbumsCollection.ArtistCount = context.Artists.Select(e => new { e.ArtistId }).Count();
【解决方案2】:

在索引操作中初始化MusicStoreDBEntities context = new MusicStoreDBEntities();

【讨论】:

  • 不,那没用。相同的“ObjectContext 实例已被处理...”
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多