Blazor 使用路由参数作为方法参数

Blazor Using Rout Parameters as Method Parameters

在我的 Blazor 组件上,我接受一个参数:

@page "/plant/{PlantName}"
    @code {
        [Parameter]
        public string PlantName { get; set; }
        private TestGarden.Models.Plants pd = new PlantData().GetPlantInformation(PlantName);
    }

在方法“GetPlantInformation”中,它表示“PlantName”- A field initializer cannot reference the non-static field, method, or property 'Plant.PlantName'

我无法将 属性 PlantName 设为静态,否则 Blazor 将无法运行。那么如何使用这个 属性 作为方法参数呢?

不确定您要做什么,但您可以使用 => 而不是 =

//                            added =>
private TestGarden.Models.Plants pd => new PlantData().GetPlantInformation(PlantName);

你做的叫Field initialization and using the => is called Expression-bodied member(名字有误请指正)

不同的是,当你使用=>时,就像你在做这个

private TestGarden.Models.Plants pd 
{
    get 
    {
        return new PlantData().GetPlantInformation(PlantName);
    }
}

一旦你得到 pd,它将 return new PlantData().GetPlantInformation(PlantName)

使用=报错的原因是你不能用另一个字段的值初始化一个字段,但是当使用=>时,你并没有初始化它,你会仅在获得 pd.

时执行 new PlantData().GetPlantInformation(PlantName)

编辑:

正如其他回答者指出的那样,您可以使用 OnInitialized.

但是您需要了解为什么以及何时应该使用 OnInitialized=>

你应该使用 OnInitialized 如果 new PlantData().GetPlantInformation(PlantName) 会做一些可能是异步的事情,比如从数据库中获取数据,因为如果你在 getter 中调用那个方法 属性,这需要时间,它可以冻结您的组件,直到数据库 return 的值。

如果return是数据库中的东西或者做一些可以异步的事情,使用OnInitialized,否则,使用=>(表达式体)就可以了。

还有一件事...

如果你使用OnInitializednew PlantData().GetPlantInformation(PlantName)只会运行一次,如果PlantName因为某种原因改变,pd的值不会'待更新。

如果您使用 =>,它将始终 运行 new PlantData().GetPlantInformation(PlantName),但如果 PlantName 已更改,则将始终使用 PlantName 的当前值。

所以关于如何获得 new PlantData().GetPlantInformation(PlantName)

的值需要考虑很多

您不能使用非静态 属性 PlantName 初始化 TestGarden.Models.Plants。你应该实例化 TestGarden.Models.Plants 以便用 属性 初始化它,这应该在 OnInitialized{Async) 方法中完成。

这个:

  @code {
    [Parameter]
    public string PlantName { get; set; }
    private TestGarden.Models.Plants pd = new 
    PlantData().GetPlantInformation(PlantName);
 }

应该这样做:

@code {
    [Parameter]
    public string PlantName { get; set; }
    private TestGarden.Models.Plants pd;

  protected override void OnInitialized()
  {
     pd = new PlantData().GetPlantInformation(PlantName);
   }

}

注意:像这样的用法:private Plant plant => new Plant(PlantName);,它的作用可能非常有限,您应该小心使用它,了解您所做的事情,因为它可能会导致不需要的结果。更可取的方法是定义一个对象变量,然后在 OnInitialized{Async) 方法中实例化它。这是做这件事的自然方式,清醒等等...

Blazor 组件类似于 C# 对象,但又不相同...该框架添加了一个语法层,用于通过所谓的 "lifecycle events".

创建和使用它们

对于初始化,您必须覆盖 OnInitialized() 方法或其异步对应的 OnInitializedAsync() 方法(如果该初始化需要访问某些异步数据存储):

protected override async Task OnInitializedAsync()
{
    pd = await GetPlantInformation(PlantName);
}

创建组件时,此方法调用只能调用一次。对于其他生命周期事件,请查看 Blazor lifecycle