如何在blazor中正确使用更可控的绑定



我正在尝试向InputSelect剃刀组件添加更多受控绑定。我要做的是在属性值发生更改时执行方法LieferanschriftChangedAsync。这是我的方法:

<InputSelect Value="Input.LieferanschriftId"
ValueChanged="@((string s) => LieferanschriftChangedAsync(s))"
ValueExpression="@(() => Input.LieferanschriftId)"
class="form-control">
<option value="0">--- Keine Lieferanschrift ---</option>
@foreach (var anschrift in _lieferanschriften)
{
<option value="@anschrift.KULA_N_NR">@anschrift.ToString()</option>
}
</InputSelect>
private Task LieferanschriftChangedAsync(string value)
{
_ = int.TryParse(value, out int lieferanschriftId);
Input.LieferanschriftId = lieferanschriftId;
Input.Lieferanschrift = _lieferanschriften.Where(x => x.KULA_N_NR == lieferanschriftId).FirstOrDefault();
return Task.CompletedTask;
}

我不想为此使用INotifyPropertyChanged接口,因为模型。然而,使用这种方法,我总是收到一条错误消息(CS0411(,它告诉我指定数据类型,因为它无法自动评估。所以我在我的方法中添加了TValue="int"。现在我得到以下错误:从";int";至";系统ReadOnlyPan";不可能。

我在这里做错了什么?LieferanschriftId是一个整数。

注意:此处提出的解决方案适用于。Net5.0.如果你使用的是早期版本的框架,你应该将InputSelect组件子类化,以支持整数或枚举值。。。

将模型中的LieferanschriftId字段定义为可以为null,如下所示:

[Required(ErrorMessage = "Please, select your...")]
public int? LieferanschriftId{ get; set; }

现在你可以做:

<option value="">--- Keine Lieferanschrift ---</option>

你没有value == 0,对吧?那么为什么要value="0"呢。相反,我们采用了可空性,如果没有它,你就无法确保你的用户选择了一个值

此:ValueChanged="@((string s) => LieferanschriftChangedAsync(s))"

可以更改为:ValueChanged="@((int? args) => { Input.LieferanschriftId = args; })"

您可以完全放弃LieferanschriftChangedSync方法,因为执行此代码不合适:

Input.Lieferanschrift = _lieferanschriften.Where(x => x.KULA_N_NR == lieferanschriftId).FirstOrDefault();

推断的类型参数(以及当您将其显式化时(是int。此类型参数也会影响ValueChanged事件。然而,您已经将事件处理程序声明为期望string而不是int。如果您将其更改为(int s)(并将LieferanschriftChangedAsync中的参数更改为int,它应该会解决编译器问题。(此外,您不必再解析该值,因为它已经是int了(。

相关内容

  • 没有找到相关文章

最新更新