запросите список и сравните идентификаторы с идентификатором пользователя, вошедшего в систему

#c# #asp.net-mvc #asp.net-core

Вопрос:

У меня есть модель списка, которая передается в мое представление. Но я хочу разделить Participant » ы » внутри списка в зависимости от того, кто User вошел в систему в ViewBag.

как я сохраняю вошедшего в систему пользователя в ViewBag с контроллера:

         HttpContext.Session.SetInt32("UserId", dbUser.UserId);
        ViewBag.UserId = HttpContext.Session.GetInt32("UserId");
 

текущий код представления:

 @model List<League>
    @{    
        if (Model != null amp;amp; Model.Any())
        {
            foreach(League i in Model)
            {
                foreach (MMLeagueParticipant mmLeagueParticipant in i.allParticipants)
                {
                    <p>@mmLeagueParticipant.child.ParticipantFirstName @mmLeagueParticipant.child.ParticipantLastName</p>
                }  
            }
        }
        else
        {
            <p>the list is empty</p>
        }
    }
 

мой код в настоящее время работает, но он отображает все Participant » ы » независимо от того, принадлежат ли они текущему входу в User систему или нет.

Решение, которое, я думал, может сработать:

 <p>Your kids:</p>
foreach(League i in Model)
{
    foreach (MMLeagueParticipant mmLeagueParticipant in i.allParticipants)
    {
        if(mmLeagueParticipant.child.Parent.UserId == ViewBag.UserId )
        {
            <p>@mmLeagueParticipant.child.ParticipantFirstName @mmLeagueParticipant.child.ParticipantLastName</p>
        }
    }
}
<p>All other kids:</p>
foreach(League i in Model)
{
    foreach (MMLeagueParticipant mmLeagueParticipant in i.allParticipants)
    {
        if(mmLeagueParticipant.child.Parent.UserId != ViewBag.UserId )
        {
            <p>@mmLeagueParticipant.child.ParticipantFirstName @mmLeagueParticipant.child.ParticipantLastName</p>
        }

    }
}
 

Ошибка, которую я получаю, пытаясь это сделать:

 NullReferenceException: Object reference not set to an instance of an object.
 

ему не нравится if(mmLeagueParticipant.child.Parent.UserId == ViewBag.UserId) линия.


Модели отношений:

  • league Модель и ViewModel ( Participant ) разделяют MMLeagueParticipant среднюю таблицу для отношений «многие ко многим» ( Participant можно играть во многие League , а у многих League может быть много Participant ).
  • The User model has a one-to-many relationships with the ViewModel . (one Logged in User can have many Participant ‘s)

Моя модель лиги:

 int LeagueId { get; set; }
string sport { get; set; }
string gender { get; set; }
string ageRange { get; set; }

​List<MMLeagueParticipant> allParticipants  { get; set; }
 

Моя модель ViewModel:

 public List<Participant> allParticipants { get; set; }
public ViewModel.Participant participant { get; set; }

public class Participant
{
int ParticipantId { get; set; }
string ParticipantFirstName { get; set; }
string ParticipantLastName { get; set; }
string ParticipantGender { get; set; }
System.DateTime ParticipantDOB { get; set; }

List<MMLeagueParticipant> allLeagues { get; set; }

int UserId { get; set; }
User Parent { get; set; }
}
 

Моя средняя таблица MMLeagueParticipant для модели лиги и модели просмотра.Участник:

 int MMLeaugeParticipantId { get; set; }
int ParticipantId { get; set; }
int LeaugeId { get; set; }
leauge sport { get; set; }

ViewModel.Participant child { get; set; }
 

Моя модель пользователя:

 int UserId { get; set; }
string FirstName { get; set; }
string LastName { get; set; }
string Email { get; set; }
string Password { get; set; }
strig ConfirmPassword { get; set; }

List<ViewModel.Participant> kids { get; set; }
 

Ответ №1:

Вы можете просто отфильтровать своих участников с помощью

var userParticipants = allParticipants.Where(p => p.UserId == Viewbag.UserId).ToList()

Это требует, чтобы вы использовали Систему.Пространство имен Linq.

Изменить: Вот более конкретный пример

 foreach(League i in Model)
            {
                var userParticipants = i.allParticipants.Where(p => p.UserId == Viewbag.UserId).ToList();
                foreach (MMLeagueParticipant mmLeagueParticipant in userParticipants)
                {
                    <p>@mmLeagueParticipant.child.ParticipantFirstName @mmLeagueParticipant.child.ParticipantLastName</p>
                }  
            }
 

Комментарии:

1. не могли бы вы привести мне пример? я не совсем уверен, как это сделать. Я довольно новичок в c# и mvc в целом

2. Конечно. Отредактировал ответ.

3. мне пришлось переодеться .Where(p => p.UserId , чтобы .Where(p => p.child.Parent.UserId . кроме того, это работает по мере необходимости