我正在尝试向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
了(。