.net core 显示一对多数据模型的ICollection时foreach循环出错

.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

我是一名初学者,正在努力学习Blazor+EF Core。我尝试了不同的教程,但我认为我遗漏了一些东西,这就是为什么我似乎无法理解发生了什么

首先:我有一个联系人的数据模型,其中一个联系人可以有多个联系人联系人地址。我是这样写的:

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!这段代码也完全有效…谢谢你,先生!!!