Razor page rendering before OnGetAsync is evaluated

Viewed 391

The code below return an ArgumentNullException: Value cannot be null. (Parameter 'source') error. The error is thrown by Model.Players.Any(). It seems the page is rendered before the code behind file is evaluated. I believe the error must related to the asyncronous call OnGetAsync, but I don't know how to fix it. Using Visual Studio debugging I have checked the value of Players property and is evaluates correctly (but after the razor page has rendered - and thrown the error)

Code behind file(extract):

    public IEnumerable<Player> Players { get; set; }
    public async void OnGetAsync()
    {
        IEnumerable<Club> clubs = await clubService.GetAllClubs();
        IEnumerable<User> users = _userManager.Users;

        Players = from user in users
                  join club in clubs on user.ClubId equals club.ClubId
                  orderby user.Name
                  select new Player
                  {
                      UserId = new Guid(user.Id),
                      Name = user.Name,
                      Surname = user.Surname,
                      DOB = user.DOB,
                      ClubId = club.ClubId,
                      ClubName = club.ClubName,
                      ClubLogo = club.ClubLogo
                  };
    }

Pazor page(extract):

    if (Model.Players.Any())
    {
        foreach (Player player in Model.Players.OrderBy(u => u.Name).ThenBy(u => u.Surname))
        {
            <div class="col-12 col-md-6 col-lg-4 col-xl-3 my-2">
                <div class="card">
                    <div class="card-header d-inline-flex align-items-center">
                        <h6>@player.Name @player.Surname</h6>
                        @if (player.ClubLogo != null)
                        {
                            <img src="~/img/clublogos/@player.ClubLogo" height="30" class="mx-2" />
                        }
                    </div>
                </div>
            </div>
        }
    }
    else
    {
        <h6>No players created yet</h6>
    }
1 Answers

I have solved the issue.

The problem was the OnGetAsync handler method returning void instead of a Task

public IEnumerable<Player> Players { get; set; }
public async Task OnGetAsync()
{
    IEnumerable<Club> clubs = await clubService.GetAllClubs();
    IEnumerable<User> users = _userManager.Users;

    Players = from user in users
              join club in clubs on user.ClubId equals club.ClubId
              orderby user.Name
              select new Player
              {
                  UserId = new Guid(user.Id),
                  Name = user.Name,
                  Surname = user.Surname,
                  DOB = user.DOB,
                  ClubId = club.ClubId,
                  ClubName = club.ClubName,
                  ClubLogo = club.ClubLogo
              };
}
Related