【问题标题】:Blazor NavigateTo reloading same pageBlazor NavigateTo 重新加载同一页面
【发布时间】:2020-05-27 20:24:52
【问题描述】:

我有列出机器任务的维护任务网站。 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 上的相关代码做相同的基本事情代码返回:

剃须刀页面代码:

        <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 页面后面的代码中放置断点,除了 OnInitializedAsync() 之外,我什么也没看到。如何让 MachineDetails 页面加载而不返回到 PerformTask?

【问题讨论】:

  • 请出示您的代码...
  • 什么代码是相关的?除了 NavigationManager 之外,几乎所有东西都只是对 repo 的调用。例如 MachineDetails 的 OnInitializedAsync() 有 GetSelectedMachine()
  • 你的代码没问题。它应该工作。但它没有,并且具有 NavigationManager.NavigateTo 的典型行为。没有看上下文,就无话可说了。
  • 将编辑原始问题以尝试显示更多上下文。

标签: c# asp.net blazor


【解决方案1】:

我的回答是基于此代码位于表单元素中的假设...

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 属性添加到具有按钮值的两个按钮:&lt;button type="button"&gt; 这将不允许回发,并且导航将按预期发生。

希望这会有所帮助...

【讨论】:

  • 是的,这是一种形式——我明天回去工作时会尝试第一件事。我想你已经明白了:)。感谢您的帮助。
  • 那行得通——谢谢。我是网络编程新手,我认为表单标签本质上只是相关控件的逻辑分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多