Blazor 获取两个属性的验证消息

Mar*_*ein 1 c# asp.net-core blazor blazor-server-side

我在 Blazor 服务器端应用程序中有一个简单的 EditForm。它有一个绑定属性,它改变了另一个也应该由表单验证的属性。

表格包含以下部分

<div class="form-group col-md-6">
    <label for="inputRechnungsnummer">Rechnungsnummer</label>
    <InputNumber @bind-Value="Input.Rechnungsnummer" id="inputRechnungsnummer" class="form-control" />
    <ValidationMessage For="() => Input.CustomerExists" />
    <ValidationMessage For="() => Input.Rechnungsnummer" />
</div>
Run Code Online (Sandbox Code Playgroud)

如您所见,我想在这个 InputField 下显示两条消息。

bond 字段调用一个方法来查找客户详细信息。

public int Rechnungsnummer 
{ 
    get => _rechnungsnummer; 
    set
    {
        _rechnungsnummer = value;
        SearchKunde();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法改变了我的属性值

private void SearchKunde()
{

    /* LOGIC */
    
    if(name != null)
    {
        Kundenname = name;
        CustomerExists = true;
    }
    else
    {
        Kundenname = "";
        CustomerExists = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个属性定义为:

[Required]
[Range(typeof(bool), "true", "true", ErrorMessage = "Bitte geben Sie eine gültige Rechnungsnummer ein")]
public bool CustomerExists { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,不会显示 CustomerExists 的验证消息。它仅在我尝试提交表单时显示。

有谁知道在更改其值后如何显示消息?

Pet*_*ris 5

我认为这里有几个问题。

1:Blazor 不会报告该属性的错误,除非您 (A) 在 Blazor 输入控件中编辑它(使属性“修改”),或 (B) 调用EditContext.Validate将验证所有属性。

2:如果您的代码异步运行,那么您还需要InvokeAsync(StateHasChanged)在最后调用。

或者,如果你将你的表单绑定到一个EditContext而不是Model你可以做这样的事情

<EditForm EditContext=@MyEditContext>
  ... your form stuff here...
</EditForm>

@code
{
  EditContext MyEditContext = new EditContext(new Person());

  protected override void OnInitialized()
  {
    base.OnInitialized();
    MyEditContext.OnFieldChanged += FieldChanged;
  }

  private void FieldChanged(object sender, FieldChangedEventArgs args)
  {
    if (args.FieldIdentifier.FieldName == nameof(Person.FirstProperty))
    {
      FieldIdentifider fd = MyEditContext.Field(nameof(Person.OtherProperty));
      MyEditContext.NotifyFieldChanged(fd);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你想获得一个不直接在你EditForm绑定的对象上的属性(例如Model.Address.PostalCode),你可以这样做

var fd = new FieldIdentifier(Model.Address, nameof(Address.PostalCode));
MyEditContext.NotifyFieldChanged(fd);
Run Code Online (Sandbox Code Playgroud)