Поиск данных в приложении Blazor возвращает нулевой массив - PullRequest
2 голосов
/ 09 октября 2019

В настоящее время я борюсь за создание своего первого проекта Blazor, который должен быть небольшим приложением CRUD. Я пытался следовать некоторым учебным пособиям, но большинство из них являются устаревшими предварительными учебными пособиями, и есть много различий, которые смущают меня.

Моя проблема в том, что я еще не понимаю некоторые основные понятия (особенно «услуги»). Когда я запускаю приложение, я получаю следующую ошибку:

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'

Временный локальный тип 'UserManagement.Models.Users []> был нулевым.

Ошибка возникает в строке "@foreach (var user in users)" в Index.razor. Я бы понял, что не было никаких данных. Тем не менее, есть данные в моей таблице пользователей. Так что я действительно не знаю, что ошибка может быть здесь.

То, что мы имеем до сих пор:

Index.razor

@page "/"
@using Models
@using Data
@inject UserService us

<form method="post">
    <input asp-page="/Create" type="button" value="Neuen Benutzer erstellen" />
</form>

<form method="post">
    <table class="table">
        <thead>
            <tr>
                <th>ID</th>
                <th>UserID</th>
                <th>Name</th>
                <th>Supervisor</th>
                <th>Ersteller</th>
                <th>Erstelldatum</th>
                <th>Optionen</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var user in users)
            {
                <tr>
                    <td>@user.PkId</td>
                    <td>@user.UserId</td>
                    <td>@user.FirstName @user.LastName</td>
                    <td>@user.Supervisor</td>
                    <td>@user.CreationUser</td>
                    <td>@user.CreationDate</td>
                    <td>
                        <a>Delete Account</a><br />
                        <a asp-page="/Edit"> Edit Account</a>
                    </td>
                </tr>
            }
        </tbody>

    </table>
</form>

@code {

    Users[] users;

    protected override async Task OnInitializedAsync()
    {
        users = await us.GetUsersAsync();
    }
}
}

UserService.cs

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;
using UserManagement.Models;

namespace UserManagement.Data
{
    public class UserService
    {
        private static  UserManagementContext _context;

        public UserService (UserManagementContext context)
        {
            _context = context;
        }

        public async Task<Users[]> GetUsersAsync()
        {
            Users[] u;
            u = await _context.Users.ToArrayAsync();
            return u;

        }
    }
}

Модель: Users.cs

using System;
using System.Collections.Generic;

namespace UserManagement.Models
{
    public partial class Users
    {
        public int PkId { get; set; }
        public int FkJobtitle { get; set; }
        public int FkCostcenter { get; set; }
        public int? FkLocation { get; set; }
        public int? FkDepartment { get; set; }
        public int? FkWorkplace { get; set; }
        public int? FkLanguage { get; set; }
        public string UserId { get; set; }
        public string Salutation { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string PersonalId { get; set; }
        public string Supervisor { get; set; }
        public string Telephone { get; set; }
        public DateTime ValidFrom { get; set; }
        public DateTime CreationDate { get; set; }
        public string CreationUser { get; set; }
        public DateTime? ModificationDate { get; set; }
        public string ModificationUser { get; set; }

        public virtual CostCenter FkCostcenterNavigation { get; set; }
        public virtual Department FkDepartmentNavigation { get; set; }
        public virtual Jobtitle FkJobtitleNavigation { get; set; }
        public virtual Language FkLanguageNavigation { get; set; }
        public virtual Location FkLocationNavigation { get; set; }
    }
}

И, конечно, леса DbContext (отрывок):

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

namespace UserManagement.Models
{
    public partial class UserManagementContext : DbContext
    {
        public UserManagementContext()
        {
        }

        public UserManagementContext(DbContextOptions<UserManagementContext> options)
            : base(options)
        {
        }

        public virtual DbSet<Approver> Approver { get; set; }
        public virtual DbSet<Branche> Branche { get; set; }
        public virtual DbSet<CostCenter> CostCenter { get; set; }
        public virtual DbSet<DealerCompany> DealerCompany { get; set; }
        public virtual DbSet<Department> Department { get; set; }
        public virtual DbSet<Jobtitle> Jobtitle { get; set; }
        public virtual DbSet<Language> Language { get; set; }
        public virtual DbSet<Location> Location { get; set; }
        public virtual DbSet<Request> Request { get; set; }
        public virtual DbSet<RequestTypes> RequestTypes { get; set; }
        public virtual DbSet<SystemRole> SystemRole { get; set; }
        public virtual DbSet<SystemType> SystemType { get; set; }
        public virtual DbSet<Systems> Systems { get; set; }
        public virtual DbSet<Users> Users { get; set; }
        public virtual DbSet<Workplace> Workplace { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
.....

При запуске мне пришлось загрузить UserService с помощью services.AddTransient вместо AddSingleton, поскольку при последнем из них возникала следующая ошибка:

System.AggregateException: «Некоторые службы не могут бытьпостроенный (Ошибка при проверке дескриптора службы 'ServiceType: UserManagement.Data.UserService Lifetime: Singleton PracticeType: UserManagement.Data.UserService': невозможно разрешить службу для типа 'UserManagement.Models.UserManagementContext' при попытке активировать 'UserManagement.Data. UserService '.)'

Ответы [ 3 ]

1 голос
/ 09 октября 2019

Дерево рендеринга уже создается до вызова OnInitialized, и foreach будет выполнено в то время, когда users по-прежнему null. Вы можете либо назначить users и сначала пустой массив, либо, my предпочтительный вариант, использовать if, чтобы проверить, следует ли вообще пытаться отображать пользователей. Это также способ, которым шаблонный проект (проект с прогнозами погоды) делает это.

@page "/"
@using Models
@using Data
@inject UserService us

<form method="post">
    <input asp-page="/Create" type="button" value="Neuen Benutzer erstellen" />
</form>

@if (users == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <form method="post">
        <table class="table">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>UserID</th>
                    <th>Name</th>
                    <th>Supervisor</th>
                    <th>Ersteller</th>
                    <th>Erstelldatum</th>
                    <th>Optionen</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var user in users)
                {
                    <tr>
                        <td>@user.PkId</td>
                        <td>@user.UserId</td>
                        <td>@user.FirstName @user.LastName</td>
                        <td>@user.Supervisor</td>
                        <td>@user.CreationUser</td>
                        <td>@user.CreationDate</td>
                        <td>
                            <a>Delete Account</a><br />
                            <a asp-page="/Edit"> Edit Account</a>
                        </td>
                    </tr>
                }
            </tbody>
        </table>
    </form>
}

@code 
{
    Users[] users;

    protected override async Task OnInitializedAsync()
    {
        users = await us.GetUsersAsync();
    }
}
1 голос
/ 10 октября 2019

Проблема в следующей строке кода:

 u = await _context.Users.ToArrayAsync();

Когда вы используете await в приведенном выше коде, метод GetUsersAsync приостанавливается до завершения ожидаемой задачи ,, затем метод OnInitializedAsyncтакже будет приостановлено. Так что массив Users будет нулевым, когда компонент будет визуализирован

Измените приведенный выше код на

 u = _context.Users.ToArray();
1 голос
/ 09 октября 2019

, когда компонент визуализируется, он пытается создать представление до выполнения OnInitializedAsync(). Он дает вам нулевой ref exc, потому что он пытается отобразить страницу, и для каждого он вызывает NextItem () итератора массива, но массив равен нулю.

Решение в index.razor инициализирует массив в ctorили измените объявление на: Users[] users = new Users[x]; Где x - количество элементов, которые вы хотите сохранить в списке. Для гибкого решения я рекомендую List вместо массива. List<User> users = new List<User>();

...