【问题标题】:Blazor: Optionally providing a method as ParameterBlazor:可选地提供一个方法作为参数
【发布时间】:2020-08-13 10:49:42
【问题描述】:

我有使用“上一个”和“下一个”按钮的分页(一个 Blazor 组件)。这个分页是通用形式,当我在第一页时我不想显示“上一页”按钮,当我在最后一页时我不想显示“下一页”按钮。

我目前的解决方案是这样工作的,html的构造方式并不重要:

<some html>

@code {
    [Parameter]
    public EventCallback OnNext { get; set; }
    [Parameter]
    public bool ShowNext { get; set; }
    [Parameter]
    public EventCallback OnPrevious { get; set; }
    [Parameter]
    public bool ShowPrevious { get; set; }
}

在我的 html 中,我将检查它是否需要显示(使用布尔值),如果需要,它将被渲染。

我宁愿像这样实现它,而不是为每个按钮提供额外的布尔参数:

<some html>

@code {
    [Parameter]
    public EventCallback OnNext { get; set; }
    private bool ShowNext => OnNext.HasDelegate;
    [Parameter]
    public EventCallback OnPrevious { get; set; }
    private bool ShowPrevious => OnPrevious.HasDelegate;
}

注意,因为 Previous 和 Next 是相同的,所以我将只在我的其余代码示例中使用 Next

在 2 种情况下,ShowNext 的值都会为 false;

  1. 您在调用中省略了 OnNext 参数;像这样:&lt;Pagination /&gt;
  2. 或者由于 EventCallback 不能为空,您提供默认值;像这样:&lt;Pagination OnNext="default(EventCallback)" /&gt;

选项 1 可以通过将 if 语句放入我的 razor 文件中来呈现带有或不带有 OnNext 参数的分页组件。但我宁愿只制作 1 个 Pagination 组件,根据情况提供方法或默认 EventCallback;像这样:

&lt;Pagination OnNext="@(ShowNextButton ? MyNextMethod : default(EventCallback))"

但是这是不允许的,因为 Method 与 EventCallback 的类型不同。

现在我知道在 KISS 下您只需添加 2 个额外参数(在我当前的解决方案中;参见第一个代码示例);任何人都更容易理解。但这主要是因为我的问题的答案并不容易,如果可能的话。否则,可选地定义参数的值是我经常使用的标准设计模式。

那么有谁知道我是否可以选择提供方法或默认 EventCallback 作为参数。

【问题讨论】:

  • 您可以选择将其更改为 Action 吗?
  • 这项工作可以&lt;Pagination OnNext="@(ShowNextButton ? () =&gt; MyNextMethod() : default(EventCallback))" 吗?
  • @Vencovsky 我之前确实尝试过;那么消息是:错误 CS0173 条件表达式类型无法确定,因为 'lambda 表达式' 和 'EventCallback' 之间没有隐式转换
  • @PeterMorris 你是对的! default(Action) 也是一个有效的 EventCallback。

标签: blazor


【解决方案1】:

感谢彼得莫里斯;这是正确的答案:

<Pagination OnNext="@(ShowNextButton ? MyNextMethod : default(Action))"

default(Action) 和我提供的方法属于同一类型,也是一个没有 Delegate 的 EventCallback!

【讨论】:

  • 我的意思是让参数类型成为一个动作
  • 是的,以前是这样,但我认为使用 EventCallbacks 会更干净。好吧,您仍然给了我提出解决方案的见解。学分归你:)
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多