Blazor 代码隐藏:为什么 OnInitialized 找不到它的重写方法?

Blazor Code-Behind: Why Is OnInitialized Not Finding Its Overridden Method?

我在 Visual Studio 2022 年使用 .NET 6.0.100-preview.6.21355.2。我从 WebAssembly 模板开始,然后是 this YouTube tutorial for implementing SQL via HTTP API under WebAssembly. The tutorial has a GitHub page with its code

所有这些都运行良好,然后我决定将代码移出 Razor 页面并移至代码隐藏页面。第一页 (counter.razor / counter.razor.cs) 工作正常,但第二页出现问题。具体来说,我在 OnInitialized 的 Intellisense 中收到 no suitable method found to override 错误。

OnInitialized 有一个空签名,就像在 CreateForecast.razor 和 this Microsoft document 中一样。那么为什么会出错呢?奇怪的是,如果我 return 将代码放入基础 Razor 页面,我会收到同样的错误。还有一些其他的 Intellisense 错误,但我怀疑包括那些会一次问多个问题:-)。

我还尝试查找 OnInitialized 签名以确保那里没有发生任何奇怪的事情。它在 ComponentBase 中列为 protected void virtual,没有参数。因此,我希望后代 class 中没有参数的受保护覆盖​​无效方法会匹配该方法。

这里是CreateForecast.Razor:

@page "/createforecast"
@using CART.Shared
@using CART.Client
@inherits CreateForecast

<h3>Create Forecast</h3>

<div class="row">
    <EditForm Model="@Forecast" OnValidSubmit="InsertForecast">
        <div class="form-group">
            <label>Date: </label>
            <InputDate @bind-Value="Forecast.Date" />
        </div>

        <div class="form-group">
            <label>Temperature (C): </label>
            <InputNumber @bind-Value="Forecast.TemperatureC" />
        </div>

        <div class="form-group">
            <label>Summary: </label>
            <InputText @bind-Value="Forecast.Summary" />
        </div>

        <div class="form-group">
            <input type="submit" class="btn btn-success" value="Create forecast" />
            <NavLink href="fetchData" class="btn btn-info">Back to forecasts</NavLink>
        </div>

    </EditForm>

</div>

(CART 是应用程序的名称。)

这里是CreateForecast.Razor.cs:

using CART.Shared;
using Microsoft.AspNetCore.Components;
using System;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Json;

namespace CART.Client.Pages
{
    public partial class CreateForecast : ComponentBase
    {
        public WeatherForecast Forecast { get; set; }
        public HttpClient httpClient;
        public NavigationManager navigationManager;
        
        protected override void OnInitialized()
        {
            Forecast.Date = DateTime.Today;
        }        

        public async Task InsertForecast()
        {
            await httpClient.PostAsJsonAsync("/api/weatherforecast", Forecast);
            navigationManager.NavigateTo("/fetchdata");
        }
    }
}

您应该删除该行

@inherits CreateForecast

我检查过,添加@inherits 确实产生了:

Error CS0115 'FetchData.BuildRenderTree(RenderTreeBuilder)': no suitable method found to override...

这并不明显。

@inherits 在旧版本的 Blazor 中使用,当时 classes 尚未生成为 partial

现在它们是 partial,而您正试图从自身继承一个 class。

旁注,在 CreateForecast.Razor.cs 中,您可以将定义缩短为

//public partial class CreateForecast : ComponentBase
  partial class CreateForecast 

这减少了混乱和出错的机会。