.net core 显示一对多数据模型的ICollection时foreach循环出错
我是一名初学者,正在努力学习Blazor+EF Core。我尝试了不同的教程,但我认为我遗漏了一些东西,这就是为什么我似乎无法理解发生了什么 首先:我有一个联系人的数据模型,其中一个联系人可以有多个联系人和联系人地址。我是这样写的:.net core 显示一对多数据模型的ICollection时foreach循环出错,.net-core,entity-framework-core,blazor,.net Core,Entity Framework Core,Blazor,我是一名初学者,正在努力学习Blazor+EF Core。我尝试了不同的教程,但我认为我遗漏了一些东西,这就是为什么我似乎无法理解发生了什么 首先:我有一个联系人的数据模型,其中一个联系人可以有多个联系人和联系人地址。我是这样写的: public class Contact { public int ID { get; set; } public string AccountNumber { get; set; } public string Ac
public class Contact
{
public int ID { get; set; }
public string AccountNumber { get; set; }
public string AccountName { get; set; }
public ICollection<ContactPerson> ContactPersons { get; set; }
public ICollection<ContactAddress> ContactAddresses { get; set; }
public string NatureOfBusiness { get; set; }
public string Industry { get; set; }
}
[HttpGet("GetContact/{id}")]
public async Task<ActionResult<Contact>> GetContact(int id)
{
if (!ContactExists(id))
{
return NotFound();
}
var contact = await _context.Contact
.Include(c => c.ContactPersons)
.Include(c => c.ContactAddresses)
.ThenInclude(ca => ca.Zip)
.FirstOrDefaultAsync(c => c.ID == id);
if (contact == null)
{
return NotFound();
}
return contact;
}
公共类联系人
{
公共int ID{get;set;}
公共字符串AccountNumber{get;set;}
公共字符串AccountName{get;set;}
公共ICollection联系人{get;set;}
公共ICollection联系人地址{get;set;}
业务的公共字符串性质{get;set;}
公共字符串行业{get;set;}
}
第二个:我有一个web服务(api)控制器,其中我返回一个单一联系人(通过id),该联系人包括其所有联系人和联系人地址,我的代码如下所示:
public class Contact
{
public int ID { get; set; }
public string AccountNumber { get; set; }
public string AccountName { get; set; }
public ICollection<ContactPerson> ContactPersons { get; set; }
public ICollection<ContactAddress> ContactAddresses { get; set; }
public string NatureOfBusiness { get; set; }
public string Industry { get; set; }
}
[HttpGet("GetContact/{id}")]
public async Task<ActionResult<Contact>> GetContact(int id)
{
if (!ContactExists(id))
{
return NotFound();
}
var contact = await _context.Contact
.Include(c => c.ContactPersons)
.Include(c => c.ContactAddresses)
.ThenInclude(ca => ca.Zip)
.FirstOrDefaultAsync(c => c.ID == id);
if (contact == null)
{
return NotFound();
}
return contact;
}
[HttpGet(“GetContact/{id}”)]
公共异步任务GetContact(int id)
{
如果(!ContactExists(id))
{
返回NotFound();
}
var contact=await\u context.contact
.包括(c=>c.联系人)
.包括(c=>c.联系人地址)
.然后包括(ca=>ca.Zip)
.FirstOrDefaultAsync(c=>c.ID==ID);
if(contact==null)
{
返回NotFound();
}
回接;
}
Third:Myrazor page使用以下代码从web服务检索数据:
@code {
[Parameter] public int contactId { get; set; }
Contact contact = new Contact();
protected async override Task OnParametersSetAsync()
{
contact = await http.GetFromJsonAsync<Contact>($"api/Contact/GetContact/{contactId}");
}
}
@code{
[参数]public int contactId{get;set;}
触点=新触点();
受保护的异步重写任务OnParametersSetAsync()
{
contact=wait http.GetFromJsonAsync($“api/contact/GetContact/{contactId}”);
}
}
Fourth:我试图用以下代码显示联系人及其联系人(razor页面):
账号:
@联系电话号码
帐户名:
@contact.AccountName
业务性质:
@商业性质
行业:
@联系工业
联系人
身份证件
缩写
联系电话
电子邮件地址
@foreach(联系人联系人联系人联系人)
{
@联系人ID
@联系人
@联系人。联系人号码
@contactperson.EmailAddress
}
但是:当我使用foreach循环显示联系人的联系人时,我在浏览器中看到“发生了未处理的错误。重新加载”,我发现它在foreach循环中,因为如果我删除foreach循环代码块,页面将在没有联系人的情况下正确显示
请帮我了解发生了什么事
多谢各位 试试这段代码
注:
不要实例化联系人对象
@code
{
[Parameter] public int contactId { get; set; }
Contact contact;
protected async override Task OnParametersSetAsync()
{
contact = await http.GetFromJsonAsync<Contact>
($"api/Contact/GetContact/{contactId}");
}
}
@code
{
[参数]public int contactId{get;set;}
接触;
受保护的异步重写任务OnParametersSetAsync()
{
contact=wait http.GetFromJsonAsync
($“api/Contact/GetContact/{contactId}”);
}
}
在组件的视图部分,请使用以下命令:
<tbody>
@if (contact == null)
{
<p><em>Loading...</em></p>
}
else
{
@foreach (ContactPerson contactperson in contact.ContactPersons)
{
<tr>
<td>@contactperson.ID</td>
<td>@contactperson.Abbr</td>
<td>@contactperson.ContactNumber</td>
<td>@contactperson.EmailAddress</td>
</tr>
}
}
</tbody>
@if(contact==null)
{
加载
}
其他的
{
@foreach(联系人联系人联系人联系人)
{
@联系人ID
@联系人
@联系人。联系人号码
@contactperson.EmailAddress
}
}
注意:上面的代码验证contact是否有值。只要contact为null(没有值),当GetFromJsonAsync方法返回时,我们就会显示消息“Loading…”,并且contact包含数据,我们会将其显示在表中
注意:您应该始终检查null。
学习生命周期方法以及Blazor是如何渲染的,这样您就可以更清楚地了解为什么要始终检查null。Wow!这段代码也完全有效…谢谢你,先生!!!