0

在我的 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 将无法工作。那么如何使用这个属性作为方法参数呢?

4

3 回答 3

3

不知道你想做什么,但你可以使用=>而不是=

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

您所做的称为字段初始化并使用=>称为表达式主体的成员(如果名称错误,请有人纠正我)。

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

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

而一旦你得到pd,它就会回来new PlantData().GetPlantInformation(PlantName)

using 给你错误的原因=是你不能用另一个字段的值初始化一个字段,但是当你使用时=>,你没有初始化它,你只会new PlantData().GetPlantInformation(PlantName)在你得到时执行pd

编辑:

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

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

你应该使用OnInitializedifnew PlantData().GetPlantInformation(PlantName)来做一些异步的事情,比如从数据库中获取数据,因为如果你在属性的 getter 中调用该方法,并且它需要时间,它可能会冻结你的组件,直到数据库返回值。

如果它从数据库返回一些东西或者做一些可能是异步的,使用OnInitialized,否则,使用=>(表达式主体)是可以的。

还有一点...

如果使用OnInitialized,new PlantData().GetPlantInformation(PlantName)将只运行一次,如果PlantName由于某种原因发生更改,pd则不会更新 的值。

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

所以有很多关于如何获得价值的思考new PlantData().GetPlantInformation(PlantName)

于 2020-05-12T15:25:53.367 回答
1

您不能使用非静态属性 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) 方法中实例化它。这是做到这一点的自然方式,清醒等......

于 2020-05-12T15:56:13.717 回答
1

Blazor 组件类似于 C# 对象,但不一样……该框架添加了一个语法层,用于通过所谓的“生命周期事件”来创建和使用它们。

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

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

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

于 2020-05-12T16:08:00.733 回答