【发布时间】: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;
- 您在调用中省略了 OnNext 参数;像这样:
<Pagination /> - 或者由于 EventCallback 不能为空,您提供默认值;像这样:
<Pagination OnNext="default(EventCallback)" />
选项 1 可以通过将 if 语句放入我的 razor 文件中来呈现带有或不带有 OnNext 参数的分页组件。但我宁愿只制作 1 个 Pagination 组件,根据情况提供方法或默认 EventCallback;像这样:
<Pagination OnNext="@(ShowNextButton ? MyNextMethod : default(EventCallback))"
但是这是不允许的,因为 Method 与 EventCallback 的类型不同。
现在我知道在 KISS 下您只需添加 2 个额外参数(在我当前的解决方案中;参见第一个代码示例);任何人都更容易理解。但这主要是因为我的问题的答案并不容易,如果可能的话。否则,可选地定义参数的值是我经常使用的标准设计模式。
那么有谁知道我是否可以选择提供方法或默认 EventCallback 作为参数。
【问题讨论】:
-
您可以选择将其更改为 Action 吗?
-
这项工作可以
<Pagination OnNext="@(ShowNextButton ? () => MyNextMethod() : default(EventCallback))"吗? -
@Vencovsky 我之前确实尝试过;那么消息是:错误 CS0173 条件表达式类型无法确定,因为 'lambda 表达式' 和 'EventCallback' 之间没有隐式转换
-
@PeterMorris 你是对的! default(Action) 也是一个有效的 EventCallback。
标签: blazor