Blazor Navigate Для перезагрузки той же страницы - PullRequest
0 голосов
/ 27 мая 2020

У меня есть веб-сайт задач по обслуживанию, на котором перечислены задачи для машины. страница MachineDetails:

 @page "/MachineDetails/{MachineName}"
 @inherits MachineDetailsBase

 <h3>Machine Details for @Machine.MachineName</h3>
 <table class="table table-bordered table-striped table-hover">
    <thead>
        <tr>
            <th scope="col">Description</th>
            <th scope="col">Repeat<br />(Days)</th>
            <th scope="col">Exp Dur<br /> (Min)</th>
            <th scope="col">Next Due</th>
            <th scope="col">Owner</th>
            <th scope="col">Perform<br />Task</th>
        </tr>
    </thead>
    @foreach (var t in Machine.TasksForMachine)
    {
        <tr scope="row">
            <td>@t.TaskDescription</td>
            <td>@t.TaskRepeatDays</td>
            <td>@t.TaskMinutes</td>
            <td>@t.NextDue.Value.ToShortDateString()</td>
            <td>@t.TaskOwnerType</td>               
            <td style="text-align:center"><button class="btn btn-primary" @onclick="(() => ShowPerformTask(t.TaskId))"> <img src="/css/open-iconic/svg/check.svg" height="12" /></button></td>                
        </tr>
    }
</table>

MachineDetailsBase:

  public class MachineDetailsBase : ComponentBase
  {
    [Inject]
    public IMaintenancePMRepository repo { get; set; }
    [Inject]
    NavigationManager NavigationManager { get; set; }
    [Parameter]
    public string MachineName { get; set; }
    public MachineForTasks Machine {get;set;}        
    // other details

    protected override async Task OnInitializedAsync()
    {
        GetSelectedMachine(MachineName);
        EmployeeList = repo.GetEmployeeList().ToList();
        StatusLoookup = repo.GetStatusList().ToList();            
    }

    private void GetSelectedMachine(string inputName)
    {
        Machine= repo.GetAllEquipment().Where(m => m.EquipmentName == inputName).FirstOrDefault(); ;
    }

    public void ShowPerformTask(int  taskID)
    {
      NavigationManager.NavigateTo("/PerformTask/" + taskID.ToString());
    }

на странице задачи Я выполняю необходимую работу, а затем снова пытаюсь вызвать NavigationManager, чтобы вернуться к исходной странице .

Соответствующий код на PerformTaskBase выполняет тот же базовый c код вещи для возврата:

код страницы бритвы:

        <div class="row">
            <div class="col-sm-4 ">
                <button class="btn btn-primary" @onclick="(() => ClosePerformTask(true))"> Save </button>
            </div>
            <div class="col-sm-4 ">
                <button class="btn btn-secondary" @onclick="(() => ClosePerformTask())"> Don't Save</button>
            </div>
        </div>

затем код:

  public void ClosePerformTask(bool SaveTask = false)
  {
     if (SaveTask)
        {                
            repo.PerformTask(TaskRecord);
            TaskToPerform.NextDue = DateTime.Today.AddDays(TaskToPerform.TaskRepeatDays.GetValueOrDefault());
            repo.UpdateTask(TaskToPerform);                
        }

        NavigationManager.NavigateTo("/MachineDetails/" + MachineID);
    }

страница MachineDetails загружается на долю секунды, затем открывается страница PerformTask.

Помещая точки останова в коде за страницей MachineDetails, я вообще не вижу ничего, кроме OnInitializedAsyn c (). Как я могу заставить страницу MachineDetails загружаться и не возвращаться к PerformTask?

1 Ответ

1 голос
/ 28 мая 2020

Мой ответ основан на предположении, что этот код находится в элементе формы ...

div class="row">
        <div class="col-sm-4 ">
            <button class="btn btn-primary" @onclick="(() => 
           ClosePerformTask(true))"> Save </button>
        </div>
        <div class="col-sm-4 ">
            <button class="btn btn-secondary" @onclick="(() => 
                        ClosePerformTask())"> Don't Save</button>
        </div>
    </div>

Я прав.

Если да, то объяснение такого поведения очень просто: использование кнопки ввода без настройки атрибута типа эквивалентно настройке атрибута типа для отправки. Когда вы нажимаете любую кнопку, в дополнение к навигации с помощью NavigationManager выполняется традиционная обратная отправка на сервер. Но вы не отправляете обратно в приложение SPA. Это означает выход за пределы области навигации вашего приложения ... Чтобы исправить это, добавьте атрибут type к обеим кнопкам со значением кнопки: <button type="button"> Это не позволит отправить назад, и навигация будет происходить должным образом.

Надеюсь, это поможет ...

...