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
这减少了混乱和出错的机会。
我在 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
这减少了混乱和出错的机会。