У меня проблема, код будет отображать каждый элемент из списка, однако пользователь может удалить только свой лайк. Как я могу улучшить код, чтобы отображался только один элемент из списка?
Любая помощь приветствуется. Спасибо!
cshtml:
@if (User.Identity.IsAuthenticated)
{
@if (Model.MovieDetail.Likes.Any(x => x.UserId == (int.Parse(User.FindFirst("Id").Value))))
{
@foreach (var like in Model.MovieDetail.Likes)
{
@if (Model.MovieDetail.Likes.Any(x => x.UserId == like.UserId))
{
<a asp-controller = "Likes" asp-action = "Remove" asp-route-id = "@like.Id"><div><i class = "fas fa-heart fa-2x" style = "color:red;"></i><span style = "color:red;"> @Convert.ToInt32(Model.MovieDetail.Likes.Count) </span></div></a>
}
}
}
@if (Model.MovieDetail.Likes.All(x => x.UserId != (int.Parse(User.FindFirst("Id").Value))))
{
<a asp-controller = "Likes" asp-action = "Add" asp-route-id = "@Model.MovieDetail.Id"><div id = "the_heart"><i class = "far fa-heart fa-2x" style = "color:red;"></i><span style = "color:red;">@Convert.ToInt32(Model.MovieDetail.Likes.Count)</span></div></a>
}
}
Я экспериментировал с большим количеством строк кода. В конце концов, я проведу рефакторинг кода, как только он заработает. отчаянные времена :)
петли - определенно большая часть вашей проблемы. Вы получаете одно сердечко за каждого человека, которому он понравился.
Сама модель имеет List <MovieLikesModel> Likes. Я не уверен, как иначе я могу получить like.id, если не перечислю все из лайков. Это мой первый проект с ядром .net





@if (User.Identity.IsAuthenticated)
{
var like = Model.MovieDetail.Likes.FirstOrDefault(x => x.UserId == (int.Parse(User.FindFirst("Id").Value)));
if (like != null)
{
<a asp-controller = "Likes" asp-action = "Remove" asp-route-id = "@like.Id"><div><i class = "fas fa-heart fa-2x" style = "color:red;"></i><span style = "color:red;"> @Convert.ToInt32(Model.MovieDetail.Likes.Count) </span></div></a>
}
else
{
<a asp-controller = "Likes" asp-action = "Add" asp-route-id = "@Model.MovieDetail.Id"><div id = "the_heart"><i class = "far fa-heart fa-2x" style = "color:red;"></i><span style = "color:red;">@Convert.ToInt32(Model.MovieDetail.Likes.Count)</span></div></a>
}
}
Запуск .Any для поиска совпадения по имени пользователя - это полная противоположность запуску .All, которое не совпадает. Вам не нужно проверять это дважды, не говоря уже о n + 2 разах, как вы это делали.
Это была моя первая попытка, но проблема остается. Когда я нажимаю на кнопку «Нравится», снова появляются два сердечка, как на картинке: \
нет, не с else. Это невозможно. Хотя думаю есть проблема с получением id для снятия. Я внесу изменения
Ты великолепен! Я не знал, что можно объявлять переменные в cshtml. Большое спасибо! х 1000
вы можете внутри блока @ {}, который включает блок @if. Вам понадобится только @ во внешнем цикле кода. Но я не проверял весь синтаксис
я не знаю, почему у вас есть цикл в цикле, когда независимо от того, что вы выводите одно и то же. А также:
else