【发布时间】:2023-03-20 08:22:01
【问题描述】:
我正在创建一个类似于DataTables 的 Blazor 组件,并且我还想实现通用过滤器。为此,我为数字创建了 2 个组件:一个整数和另一个浮点数。
从主组件,我想传递数字类型。
<NumberInput TNumber="short"
Value="@FilterRule.FilterValue"
OnValueChangedEvent="@FilterRule.UpdateFilterValue"
IncludeApply="IncludeApply()"
IsApplied="@FilterRule.IsApplied"
AppliedText="@FilterRule.FilterValue!.ToString()"
ApplyFilterEvent="(e) => ApplyFilter(FilterRule.Guid, true)"
UnApplyFilterEvent="(e) => UnApplyFilter(FilterRule.Guid, true)"
Attributes="Attributes"
ApplyButtonCssClass="@ApplyButtonCssClass"
InputCssClass="@InputCssClass"
MaxWidth="MaxWidth" />
例如TNumber可以有short、int、long等。这是因为我有一个函数可以为每种类型的数字提供最小值和最大值。
public static Tuple<T, T> GetMinMaxValue<T>()
{
object obj1 = (object)default(T);
object obj2 = (object)default(T);
if (obj1 == null || obj2 == null)
return (Tuple<T, T>)null;
switch (Type.GetTypeCode(typeof(T)))
{
case TypeCode.Int16:
obj1 = (object)char.MinValue;
obj2 = (object)char.MaxValue;
break;
case TypeCode.SByte:
obj1 = (object)sbyte.MinValue;
obj2 = (object)sbyte.MaxValue;
break;
// and so on...
}
}
NumberInput 有这个代码:
<input class="@DefaultClass form-control-sm @InputCssClass" type="number" value="@Value"
style="@(MaxWidth != 0 ? string.Format("max-width: {0}px", (object) this.MaxWidth) : "")"
@onchange="@UpdateValue" step="any">
@code {
[Parameter] public long Value { get; set; }
[Parameter] public EventCallback<ValueChangedEventArgs> OnValueChangedEvent { get; set; }
[Parameter] public string DefaultClass { get; set; } = "form-control";
[Parameter] public bool IncludeApply { get; set; } = false;
[Parameter] public bool IsApplied { get; set; } = false;
[Parameter] public string AppliedText { get; set; } = "";
[Parameter] public string InputCssClass { get; set; } = "";
[Parameter] public string ApplyButtonCssClass { get; set; } = "";
[Parameter] public Dictionary<string, object> Attributes { get; set; }
[Parameter] public int MaxWidth { get; set; }
[Parameter] public EventCallback<MouseEventArgs> ApplyFilterEvent { get; set; }
[Parameter] public EventCallback<MouseEventArgs> UnApplyFilterEvent { get; set; }
private async Task UpdateValue(ChangeEventArgs args)
{
Value = Convert.ToInt32(args.Value.ToString());
await this.OnValueChangedEvent.InvokeAsync(new ValueChangedEventArgs((object)this.Value));
}
}
所以,问题是:如何将我想要使用的变量类型作为参数传递?
【问题讨论】:
-
将您的 Value 参数替换为 razor 文件顶部的
@typeparam TNumber Value -
不要在组件内部设置
[Parameter]值(就像你为Value设置的一样) - 请参阅github.com/dotnet/aspnetcore/issues/… 了解原因
标签: blazor blazor-server-side blazor-webassembly