#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! Еще раз большое вам спасибо!!