将方法作为参数传递时,Blazor 中“@MethodName”和“MethodName”的区别?

Joe*_*omp 4 c# asp.net-core blazor blazor-server-side

我在 Blazor 中有一个组件,它接受方法作为参数。

<SuppliersTable Loader="@LoadS" LoaderO="@LoadO" Adder="@Add" Updater="@Update" Remover="@Remove" />

@code {
    async Task<List<Supplier>> LoadS() => (await ModelServiceS.GetAllAsync()).ToList();
    async Task<List<Operator>> LoadO() => (await ModelServiceO.GetAllAsync()).ToList();
    async Task<bool> Add(Supplier model) => await ModelServiceS.AddAsync(model);
    async Task<bool> Update(Supplier model) => await ModelServiceS.UpdateAsync(model);
    async Task<bool> Remove(Supplier model) => await ModelServiceS.RemoveAsync(model);
}
Run Code Online (Sandbox Code Playgroud)

但是如果你不把“@”放在方法名称前面,它会做一些完全不同的事情吗?编译器接受两种方式,这就是我问的原因。我有一种感觉,它使用“@”执行方法并将返回值作为参数传递,如果没有“@”,您只是引用父组件要调用的方法(这就是我想要的)。有人可以向我提供有关“@”用法的更多详细信息吗?

SuppliersTable 组件的参数类型如下:

[Parameter] public Func<Task<List<Supplier>>> Loader { get; set; }
[Parameter] public Func<Task<List<Operator>>> LoaderO { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Adder { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Updater { get; set; }
[Parameter] public Func<Supplier, Task<bool>> Remover { get; set; }
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 7

这是新旧语法的问题。Blazor 的预览阶段有很多变化,其中一项主要清理是在预览 6 中

在此 Blazor 版本中,我们对指令属性的通用语法进行了标准化。

  • @onclick="IncrementCount" 现在是事件处理程序的标准形式。

  • @onclick="@IncrementCount" 效果很好,但您应该仅考虑向后兼容。

  • @onclick="() => IncrementCount(step)"也可以,用它来传递参数。否则,这只是一个不必要的额外步骤。

  • onclick="aJsFunction" 用于调用 JavaScript。

您的[Parameter]属性值也是如此,但它们不需要(或允许)@前缀。


Chr*_*att 5

在它以任何一种方式工作的情况下,结果都是一样的。您不会取消引用该方法(即()),因此它不会执行该方法;你仍在传递参考。

这归结为@明确地将 Razor 解析加入到混合中。在某些情况下,Razor 无法解释它需要或应该做某事,您通常可以通过智能感知突出显示看到。在这些情况下,您必须添加@符号。但是,如果 Razor 已经想通了,添加@基本上没有任何作用。