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
,否则,使用=>
(表达式体)就可以了。
还有一件事...
如果你使用OnInitialized
,new 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
在我的 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
,否则,使用=>
(表达式体)就可以了。
还有一件事...
如果你使用OnInitialized
,new 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