【问题标题】:How to use more controlled binding in blazor correctly?如何在 blazor 中正确使用更多受控绑定?
【发布时间】:2021-03-18 07:47:49
【问题描述】:

我正在尝试向InputSelect razor 组件添加更多受控绑定。我要做的是在属性值发生变化时执行方法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”转换为“System.ReadOnlySpan”。

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

【问题讨论】:

    标签: c# asp.net-core blazor


    【解决方案1】:

    注意:此处建议的解决方案适用于 .Net5.0。如果您使用的是较早版本的框架,则应将 InputSelect 组件子类化以启用对整数或枚举值的支持...

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

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

    现在你可以这样做了:

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

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

    这个:ValueChanged="@((string s) =&gt; LieferanschriftChangedAsync(s))"

    可以改成: ValueChanged="@((int? args) =&gt; { Input.LieferanschriftId = args; })"

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

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

    【讨论】:

    • 感谢埃内特!将变量声明为可为空的 int 就可以了。值 0 对我来说没问题;)所以我刚刚添加了?? 0 在我的二传手那里。奇怪的是它确实适用于 int?而不是 int。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2017-05-08
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多