Blazor - навигация и государственный выпуск - PullRequest
3 голосов
/ 04 марта 2020

Сценарий:

В настоящее время я создаю базовое c серверное приложение Blazor crud, Blazor - это то, с чем я только что начал экспериментировать.

У меня есть возникла проблема с кнопкой «Назад» при переходе назад со страницы редактирования на страницу индекса. Проблема заключается в следующем:

  1. Я редактирую запись и вносю некоторые изменения в поле без сохранения
  2. Я нажимаю кнопку "Назад", которая возвращает на страницу индекса
  3. Запись, в которую я внес изменения в списке записей, показывает изменения, которые я внес в форму редактирования, однако я не нажал "Сохранить".
  4. Я обновляю sh страницу, и запись возвращается к это исходное состояние.

Я пытался использовать кнопку с нажатием и следующее:

<a href="/branches" class="btn btn-sm btn-secondary mr-2"><i class="oi oi-arrow-circle-left"></i> Back</a>

Вопрос:

Любые идеи, где я ' я иду не так?

Индекс:

@page "/branches"
@inject BranchRepository repository

<GenericList List="branches">    
  <WholeListTemplate>
    <table class="table table-hover">
        <thead>
            <tr>
                <th>Name</th>
                <th>Code</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in branches)
            {
                <tr>
                    <td>@item.sName</td>
                    <td>@item.sBranchNumber</td>
                    <td><a href="/branch/edit/@item.Id" class="btn btn-sm btn-warning">Edit</a></td>
                </tr>
            }
        </tbody>
    </table>
  </WholeListTemplate>
</GenericList>

@code {
  List<Core.Entities.Branch> branches;

  protected async override Task OnInitializedAsync()
  {
    branches = null;
    branches = await repository.GetAllBranches();
  }
}

Редактировать:

@page "/branch/edit/{id:int}"

@inject NavigationManager navigationManager
@inject BranchRepository repository

<h2>Edit Branch</h2>
<hr />

@if(branch != null)
{
  <BranchEditForm Branch="branch" OnValidSubmit="Update" />
}

@code {
  [Parameter] public int Id { get; set; }

  private Branch branch;

  protected override void OnInitialized()
  {
    branch = repository.GetById(Id);
  }

  private void Update()
  {
    repository.Update(branch);
    navigationManager.NavigateTo("branches");
  }
}

BranchEditForm:

<EditForm Model="Branch" OnValidSubmit="OnValidSubmit">
   <DataAnnotationsValidator />
    <div class="form-row">
      <div class="form-group col-md-6">
         <label>
            Name
         </label>
         <InputText class="form-control" @bind-Value="@Branch.sName" />
         <ValidationMessage For="@(() => Branch.sName)" />
      </div>
       <div class="form-group col-md-6">
         <label>
            Branch Number
         </label>
         <InputText class="form-control" @bind-Value="@Branch.sBranchNumber" />
         <ValidationMessage For="@(() => Branch.sBranchNumber)" />
       </div>
     </div>

    <a href="/branches" class="btn btn-sm btn-secondary mr-2"><i class="oi oi-arrow-circle-left"></i> Back</a>
    <button type="submit" class="btn btn-sm btn-success"><i class="oi oi-document"></i> Save</button>
</EditForm>

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

1 Ответ

1 голос
/ 05 марта 2020

Причина

DbContext кэшировал изменения, внесенные в сущность

Решение

С помощью полезных комментариев я изучил кэширование DbContext в EF Core и нашел полезный пост https://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/.

Благодаря этому я нашел способ перезагрузить сущность или совокупность сущностей в целом:

Одна сущность

    public async Task ReloadEntity<TEntity>(TEntity entity)
    {
        if (entity != null) await context.Entry(entity).ReloadAsync();

        return;
    }

Несколько сущностей

Примечание - Согласно посту, указанному выше, это идеально подходит для нескольких организаций. Проблемы с производительностью могут возникнуть, если большие списки передаются в

    public async Task ReloadEntities<TEntity>(List<TEntity> entities)
    {
        if (entities.Count() > 0)
        {
            foreach (var entity in entities) if (entity != null) await context.Entry(entity).ReloadAsync();
        }

        return;
    }
...