Свойство ICollection пусто во время OnValidSubmit()

#entity-framework-core #datagrid #blazor #syncfusion

#entity-framework-core #datagrid #blazor #syncfusion

Вопрос:

Я пробую бесплатную версию сообщества Syncfusion Blazor SfGrid для моего базового CRUD ICollection свойства. Но, хотя я могу добавлять, редактировать, удалять во время выполнения (данные отлично отображаются в datagrid), мое ICollection свойство всегда пусто во OnValidSubmit() время …

1-й: мои модели данных выглядят следующим образом:

 public class Contact
{
    public int ID { get; set; }
    public string AccountName { get; set; }
    public ICollection<ContactPerson> ContactPersons { get; set; }
}

public class ContactPerson
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}
  

2-й: мой create.razor использует мой ContactForm.razor для повторного использования

 <h1>Create</h1>
<hr />
<div style="margin: 50px">
    <ContactForm Contact="contact" OnValidSubmit="@CreateRecord" OnCancelButton="@CancelRecord"/>
</div>

@code {
    private Contact contact = new Contact
    {
        ContactPersons = new ContactPerson[0],
        ContactAddresses = new ContactAddress[0]
    };

    void CancelRecord()
    {
        uriHelper.NavigateTo("contact");
    }

    async Task CreateRecord()
    {          
        await http.PostAsJsonAsync("api/Contact", contact);
        uriHelper.NavigateTo("contact");
    }
}
  

3-й: мой ContactForm.razor выглядит следующим образом (который я использую для создания и редактирования записи):

 @if (Contact == null)
{
    <text>Loading...</text>
}
else
{
    <EditForm Model="@Contact" OnValidSubmit="@OnValidSubmit">
        <DataAnnotationsValidator />
        <ValidationSummary />
        <div class="form-row">
            <div class="form-group col-md-3">
                <SfTextBox @bind-Value="@Contact.AccountName" Placeholder="Account Name"></SfTextBox>
                <ValidationMessage For="@(() => Contact.AccountName)"></ValidationMessage>
            </div>
        </div>
        
        <!-- List of Contact Persons -->
        <div class="form-row">
            <div class="form-group col-md-10">
                <SfGrid DataSource="@Contact.ContactPersons" Toolbar="@(new List<string>() { "Add", "Edit", "Delete", "Cancel", "Update" })" AllowPaging="true">
                    <GridEditSettings AllowAdding="true" AllowEditing="true" AllowDeleting="true"></GridEditSettings>
                    <GridColumns>
                        <GridColumn Field=@nameof(ContactPerson.ID) IsPrimaryKey="true" HeaderText="ID"></GridColumn>
                        <GridColumn Field=@nameof(ContactPerson.FirstName) HeaderText="First Name"></GridColumn>
                        <GridColumn Field=@nameof(ContactPerson.MiddleName) HeaderText="Middle Name"></GridColumn>
                        <GridColumn Field=@nameof(ContactPerson.LastName) HeaderText="Last Name"></GridColumn>                        
                    </GridColumns>
                </SfGrid>
            </div>
        </div>

        <!-- Post and Back Link -->
        <hr />
        <div>
            <SfButton type="submit" CssClass="e-primary">Sumbit</SfButton>
            <SfButton type="button" CssClass="e-danger" @onclick="@OnCancelButton">Cancel</SfButton>
        </div>
    </EditForm>
}

@code {
    [Parameter] public Contact Contact { get; set; }
    [Parameter] public EventCallback OnValidSubmit { get; set; }
    [Parameter] public EventCallback OnCancelButton { get; set; }
}
  

Проблема, с которой я сталкиваюсь, заключается в том, что Contact.ContactPersons оно пусто, когда я передаю его своему контроллеру (webapi), и когда я прерываю CreateRecord() which is `` OnValidSubmit и просматриваю переменную Contact.ContactPersons в VS2019, переменная пуста и говорит

Невозможно оценить.

Пожалуйста, помогите мне понять, что происходит.

Ответ №1:

Проблема, не связанная с Blazor…

Поскольку ContactPersons имеет ICollection<ContactPerson> тип, вы должны создать экземпляр поля ContactPersons с коллекцией объектов ContactPerson, подобных этому:

  private Contact contact = new Contact
    {
        ContactPersons = new List<ContactPerson>()
       
    };
  

Комментарии:

1. Большое вам спасибо, сэр Энет и сэр Хенк .. я начинаю это понимать now..it потому что ContactPersons — это интерфейс, на самом деле он просто содержит ссылочный адрес? Поэтому мне нужно создать его с помощью списка, и поскольку я не знаю точного количества записей, которые он может получить, лучше использовать динамический список поверх фиксированного массива ContactPersons! Еще раз большое вам спасибо!!