Asp.net core Blazor应用程序中的数据检索返回空数组
我目前正在努力创建我的第一个Blazor项目,它应该是一个小型CRUD应用程序。我试着学习一些教程,但大多数都是过时的放松前教程,有很多差异让我困惑 我的问题是我还不了解一些基本概念(尤其是“服务”)。启动应用程序时,出现以下错误: System.NullReferenceException:'对象引用未设置为 对象的实例。” “UserManagement.Models.Users[]>类型的临时本地值为null 错误发生在Index.razor中的“@foreach(用户中的var user)”行。我知道没有检索到任何数据。但是,我的用户表中有数据。所以我真的不知道错误可能在这里 到目前为止,我们所做的是: Index.razorAsp.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
@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();