这似乎是一个基本问题,然而,我似乎无法弄清楚我做错了什么。我有一个'FavouritePost'列表,其中包含'FavId',UserId和PostId。此类用于确定用户是否已将帖子添加到“收藏”列表中。在我的控制器中,我过滤掉帖子,只选择与当前userId匹配的帖子。在我看来,我有以下foreach循环:
@foreach (var fav in Model.FavPosts)
{
if (post.PostId == fav.PostId)
{
<img src="@Url.Content("~/Content/images/favourite_img.jpg")" alt="" />
}
else if (post.PostId != fav.PostId)
{
<img src="@Url.Content("~/Content/images/Notfavourite_img.jpg")" alt="" />
}
}
我的问题是:当foreach循环运行时,它会根据用户是否“喜欢”该帖子在帖子旁边显示一个图片。但是,当我运行以下代码时,它会在帖子旁边分配多个图像。例如,基于以下表格数据:
FavId UserId PostId
1 1 1
2 1 2
3 1 4
UserId = 1,已经喜欢三个帖子(1,2,4),但是,UserId = 1还没有“喜欢”帖子3
然而,当我运行我的页面时,对于第一篇文章,显示了3张图像。
Post 1 = "Liked Image", "Not Liked Image", "Not Liked Image"
Post 2 = "Not Liked Image", "Liked Image", "Not Liked Image"
Post 2 = "Not Liked Image", "Not Liked Image", "Liked Image"
似乎要迭代三次,并为帖子分配三个图像,而不是一个图像。我意识到这是因为列表中的UserId数量,但是,我认为条件语句会阻止替代图像显示。对于冗长的问题道歉,我只是认为这会让我更容易理解我的困境。任何帮助都会很棒。
答案 0 :(得分:2)
你应该沿着这些方向做点什么:
@if (Model.FavPosts.Any(x => x.PostId == post.PostId))
// show favourite icon
else
// show not favourite icon
或者,如果使用Post
定义了PostId
类的相等性,则可能能够(可以说)提高可读性:
@if (Model.FavPosts.Contains(post))
// show favourite icon
else
// show not favourite icon
您现在正在做的是检查FavPost
中的每个帖子,看它是否匹配,并每次输出信息。要知道你的真实含义是不够聪明的,只是做你所说的。类似于以下代码如何编写2个nopes和yep:
int[] favorites = { 1, 2, 3 };
int thisOne = 3;
foreach (var fav in favorites)
{
if (thisOne == fav)
{
Console.WriteLine("yep");
}
else if (thisOne != fav)
{
Console.WriteLine("nope");
}
}
答案 1 :(得分:0)
怎么样:
@if(Model.FavPosts.Where(f => post.PostId == f.PostId).Any())
{
<img src="@Url.Content("~/Content/images/favourite_img.jpg")" alt="" />
}
else
{
<img src="@Url.Content("~/Content/images/Notfavourite_img.jpg")" alt="" />
}
如果我理解正确,您需要检查帖子在FavPost列表中是否有条目。如果它有一个条目输出最喜欢的图像,而不是Notfavourite图像。