Asp.net core Blazor应用程序中的数据检索返回空数组

Asp.net core Blazor应用程序中的数据检索返回空数组,asp.net-core,blazor,blazor-server-side,Asp.net Core,Blazor,Blazor Server Side,我目前正在努力创建我的第一个Blazor项目,它应该是一个小型CRUD应用程序。我试着学习一些教程,但大多数都是过时的放松前教程,有很多差异让我困惑 我的问题是我还不了解一些基本概念(尤其是“服务”)。启动应用程序时,出现以下错误: System.NullReferenceException:'对象引用未设置为 对象的实例。” “UserManagement.Models.Users[]>类型的临时本地值为null 错误发生在Index.razor中的“@foreach(用户中的var user

我目前正在努力创建我的第一个Blazor项目,它应该是一个小型CRUD应用程序。我试着学习一些教程,但大多数都是过时的放松前教程,有很多差异让我困惑

我的问题是我还不了解一些基本概念(尤其是“服务”)。启动应用程序时,出现以下错误:

System.NullReferenceException:'对象引用未设置为 对象的实例。”

“UserManagement.Models.Users[]>类型的临时本地值为null

错误发生在Index.razor中的“@foreach(用户中的var user)”行。我知道没有检索到任何数据。但是,我的用户表中有数据。所以我真的不知道错误可能在这里

到目前为止,我们所做的是:

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();
    }
}
}
当然还有一个支架式的DbContext(摘录):

使用系统;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.EntityFrameworkCore.Metadata;
名称空间UserManagement.Models
{
公共部分类UserManagementContext:DbContext
{
公共用户管理上下文()
{
}
公共用户管理上下文(DbContextOptions)
:基本(选项)
{
}
公共虚拟数据库集审批者{get;set;}
公共虚拟数据库集分支{get;set;}
公共虚拟数据库集成本中心{get;set;}
公共虚拟DbSet DealerCompany{get;set;}
公共虚拟数据库集部门{get;set;}
公共虚拟数据库集作业标题{get;set;}
公共虚拟数据库集语言{get;set;}
公共虚拟数据库集位置{get;set;}
公共虚拟数据库集请求{get;set;}
公共虚拟数据库集请求类型{get;set;}
公共虚拟数据库集SystemRole{get;set;}
公共虚拟数据库集SystemType{get;set;}
公共虚拟数据库集系统{get;set;}
公共虚拟数据库集用户{get;set;}
公共虚拟数据库集工作区{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
如果(!optionBuilder.IsConfigured)
.....
在启动时,我必须使用services.AddTransient而不是AddSingleton来加载UserService,因为后者会遇到以下错误:

System.AggregateException:'某些服务无法启动 已构造(验证服务描述符时出错) '服务类型:UserManagement.Data.UserService生命周期:Singleton ImplementationType:UserManagement.Data.UserService”:无法 解析“UserManagement.Models.UserManagementContext”类型的服务 试图激活“UserManagement.Data.UserService”时)


渲染组件时,它会尝试在执行
OnInitializedAsync()
之前创建视图。 它为您提供null ref exc,因为它尝试呈现页面,for each调用数组迭代器的NextItem(),但数组为null

index.razor中的解决方案初始化ctor中的数组或将声明更改为:
Users[]Users=新用户[x];
其中x是要存储在列表中的元素数。 对于灵活的解决方案,我建议使用列表而不是数组。
列表用户=新列表()

在调用
OnInitialized
之前,渲染树已经在构建,并且
foreach
将在
用户
仍然为
空的时候执行。您可以先分配
用户
并清空数组,或者,我的首选变体,使用
if
检查是否应该尝试呈现所有用户。这也是模板项目(带有天气预报的项目)的方式

@page/“
@使用模型
@使用数据
@为我们注入用户服务
@如果(用户==null)
{
加载

} 其他的 { 身份证件 用户ID 名称 监督人 骗子 厄斯泰尔达姆 选项 @foreach(用户中的var用户) { @user.PkId @user.UserId @user.FirstName@user.LastName @用户、主管 @user.CreationUser @用户创建日期 删除帐户
编辑帐户 } } @代码 { 用户[]个用户; 受保护的重写异步任务OnInitializedAsync() { users=waiting us.GetUsersAsync(); } }
问题出现在下面的代码行中:

 u = await _context.Users.ToArrayAsync();
在上述代码中使用wait时,方法
GetUsersAsync
将被挂起,直到等待的任务完成,然后方法
OnInitializedAsync
也将被挂起。因此,当呈现组件时,用户数组为null

将上述代码更改为

 u = _context.Users.ToArray();
关于
u=(wait_context.Users?.ToArrayAsync())?新用户[0])
;将某些内容设置为
Users
,例如
Users[]Users=new Users[0];
。不要将其保留为空
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)
.....
@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();
    }
}
 u = await _context.Users.ToArrayAsync();
 u = _context.Users.ToArray();