1

我在视图中显示数据库中最流行的标签时遇到问题。我不确定这个问题的标题,所以如果有人有更好的标题,请重命名。

设想

我需要在我的索引页面上显示最近的帖子、最近的画廊和最受欢迎的标签。我决定为此使用元组,它工作得很好,直到我尝试显示最流行的标签。

错误

传入字典的模型项的类型为“System.Tuple 3[photoBlog.Models.Gallery[],photoBlog.Models.Post[],System.Linq.IGrouping2[System.Int32,photoBlog.Models.PostTag][]]”,但此字典需要类型为“System.Tuple`3[photoBlog.Models”的模型项.Gallery[],photoBlog.Models.Post[],photoBlog.Models.PostTag[]]'。

如您所见,它给了我错误的对象类型。我希望它是一个数组,但它给了我一些System.Linq.Grouping东西。

代码

如您所见,我将其转换为控制器中的数组。

public ActionResult Index()
{
    photoBlogModelDataContext _db = new photoBlogModelDataContext();
    var posts = _db.Posts.OrderByDescending(x => x.DateTime).Take(4).ToArray();
    var galleries = _db.Galleries.OrderByDescending(x => x.ID).Take(4).ToArray();
    var posttags = _db.PostTags.GroupBy(x => x.TagID).OrderBy(x => x.Count()).Take(4).ToArray();
    return View(Tuple.Create(galleries, posts, posttags));
}

我的观点是直截了当的,请注意,在我尝试添加最流行的标签之前,这确实有效。

@model Tuple<photoBlog.Models.Gallery[], photoBlog.Models.Post[], photoBlog.Models.PostTag[]>
@foreach (var tag in Model.Item3)
{ 
    @tag.Tag.Name
}
4

3 回答 3

3

你可能想要

var posttags = _db.PostTags
    .GroupBy(x => x.TagID)
    .OrderBy(x => x.Count())
    // Take each group and pass the first tag of the group
    .Select(g => g.First())
    .Take(4)
    .ToArray();

目前,您正在传递例如最流行标签的所有 8 个实例、第二流行标签的所有 5 个实例等,每个实例都在他们自己的组中。我想您只想传递每个标签的“示例”。

于 2012-06-01T14:28:07.547 回答
1

我并不是要完全回避选角问题,但是稍微简化一下如何:

public class PopularStatsViewModel{
  public Gallery[] Galleries { get; set; }
  public Post[] Posts { get; set; }
  public PostTags[] Tags { get; set; }
}

新建一个 PopularStats 实例并将属性设置为您的数据库调用的结果。那么在你看来:

@model photoblog.Models.PopularStatsViewModel

当然,这可以帮助您解决强制转换问题,但更重要的是,它使测试变得更容易,让您在重构/扩展该 stats 对象时更加自由,并且很清楚您在视图上使用的内容是什么时候您正在访问 VM 属性。

于 2012-06-01T14:28:48.620 回答
0

尝试更改photoBlog.Models.PostTag[]IGrouping<TagIDType, photoBlog.Models.PostTag>[]

于 2012-06-01T14:28:06.093 回答