У меня есть главная страница Transact.razor Страница. Внутри моего Transact Page есть кнопка Add New, которая открывает MudDialog (AddTransact.razor), где я могу добавить новую транзакцию. Если бы я закрыл MudDialog (Add Transact), я бы хотел повторно отобразить страницу транзакции, чтобы вновь добавленная транзакция отразилась в таблице на странице транзакции.
Как мне это сделать?
Я использую blazor на стороне сервера .Net 8. Поскольку blazor — это одностраничное приложение, я хочу повторно отобразить страницу, потому что «обновление» страницы противоречит цели SPA.
То, что я пробовал до сих пор:
Transact.razor
private async Task AddNew()
{
var options = new DialogOptions { ClassBackground = "my-custom-class", CloseOnEscapeKey = true, MaxWidth = MaxWidth.Medium, FullWidth = true, NoHeader = true };
var dialog = DialogService.Show<AddTransact>("Add New", options);
var result = await dialog.Result;
if (!result.Cancelled)
{
await vwTranService.GetAllVwTransactions();
StateHasChanged();
}
}
Это мой AddTransact.razor (Диалог)
private async void Submit()
{
if (selectedUser is not null)
{
isVisible = true;
await Task.Delay(1000);
Transaction!.UserID = selectedUser?.id;
Transaction!.DOCUMENT_NUM = DocumentNumber;
Transaction.CREATED_DATE = DateValue;
Transaction.PARTICULARS = Particulars;
Transaction.AMOUNT = Amount;
if (Amount > selectedUser!.Balance)
{
Snackbar.Add("User does not have enough balance.", Severity.Error);
return;
}
Balance!.UserID = selectedUser?.id;
Balance.Balance -= Amount;
await tranService.AddTransactionAsync(Transaction);
await balanceService.UpdateBalance(Balance);
Snackbar.Add("Transaction added successfully", Severity.Success);
Transaction = new();
selectedUser = new();
users = new();
await vwUserService.GetAllUsers();
await GenerateDocumentNumberAsync();
Amount = 0;
Particulars = string.Empty;
Balance = new();
isVisible = false;
StateHasChanged();
return;
}
Snackbar.Add("Please select a user", Severity.Warning);
}
почему-то это не работает
Предположительно, оно добавлено в диалог.
Если AddTransact фиксирует изменения в хранилище данных, await vwTranService.GetAllVwTransactions(); должен получить последний список. Следовательно, внутри происходит что-то, чего вы не показали. Можете ли вы показать свой код AddTransact? Кроме того, вам не нужен StateHasChanged, если AddNew является событием пользовательского интерфейса.
@ Bennyboy1973 Bennyboy1973 часть добавления находится в диалоговом окне. Отредактируем вопрос и добавим метод добавления.
Привет @Ben! Мы вызываем метод StateHasChanged класса ComponentBase, чтобы сообщить компоненту Blazor, что состояние компонента изменилось. Итак, он должен получить повторный рендеринг, пожалуйста, установите точку останова на строку await vwTranService.GetAllVwTransactions(); в AddNew, если данные были добавлены. Вы не делитесь всем кодом компонента и связанных с ним сервисов, лучше поделиться им с нами. Если данные были успешно добавлены, что если попробовать await InvokeAsync(StateHasChanged), здесь все работает нормально?





Создал метод для загрузки данных вместо помещения их в метод OnInitializedAsync.
Метод загрузки данных:
private async Task LoadData()
{
if (isHr)
{
searchResults = await vwTranService.GetAllVwTransactions();
searchResults = searchResults.Where(x => x.Status == "In-Process").ToList();
}
else
{
searchResults = await vwTranService.GetAllVwTransactions();
searchResults = searchResults.OrderByDescending(x => x.ID).ToList();
}
}
то в моей AddNew задаче:
Я использовал ReloadDataServer:
private async Task AddNew()
{
var options = new DialogOptions
{
ClassBackground = "my-custom-class",
CloseOnEscapeKey = true,
MaxWidth = MaxWidth.Medium,
FullWidth = true,
NoHeader = true
};
var dialog = DialogService.Show<AddTransact>("Add New", options);
var result = await dialog.Result;
if (!result.Canceled)
{
await LoadData();
await TransactionGrid.ReloadServerData();
}
}
Поэтому вместо обновления всей страницы (что могло бы разрушить SPA) я обновил саму сетку данных, чтобы перезагрузить вновь добавленную транзакцию.
Где та часть, где вы действительно что-то добавляете? Насколько я могу судить, вы получаете результат, а потом вообще ничего с ним не делаете.