Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Blazor获取两个属性的验证消息_C#_Asp.net Core_Blazor_Blazor Server Side - Fatal编程技术网

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

C# Blazor获取两个属性的验证消息,c#,asp.net-core,blazor,blazor-server-side,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="Inpu

我在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>
此方法更改了“我的属性”的值

private void SearchKunde()
{

    /* LOGIC */
    
    if(name != null)
    {
        Kundenname = name;
        CustomerExists = true;
    }
    else
    {
        Kundenname = "";
        CustomerExists = false;
    }
}
第二个属性定义为:

[Required]
[Range(typeof(bool), "true", "true", ErrorMessage = "Bitte geben Sie eine gültige Rechnungsnummer ein")]
public bool CustomerExists { get; set; }
但是,不会显示CustomerExists的验证消息。它只在我尝试提交表格时显示


有人知道在更改消息值后如何显示该消息吗?

我认为这里有一些问题

1:Blazor不会报告属性的错误,除非您在Blazor输入控件中对其进行编辑以修改属性,或者调用EditContext.Validate以验证所有属性

2:如果代码异步运行,那么最后还需要调用invokeasyncstatehaschange

或者,如果将表单绑定到EditContext而不是模型,则可以执行以下操作

<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);
    }
  }
}

我认为这里有一些问题

1:Blazor不会报告属性的错误,除非您在Blazor输入控件中对其进行编辑以修改属性,或者调用EditContext.Validate以验证所有属性

2:如果代码异步运行,那么最后还需要调用invokeasyncstatehaschange

或者,如果将表单绑定到EditContext而不是模型,则可以执行以下操作

<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);
    }
  }
}

也许您需要在致电SearchKunde后致电StateHasChanged?这个问题有足够多的细节。我能够理解问题并提供解决方案。请重新打开它。也许您需要在呼叫SearchKunde后呼叫StateHasChanged?这个问题有足够的详细信息。我能够理解问题并提供解决方案。请重新打开它。关于第2点InvokeAsyncStateHasChanged,我们必须在所有异步方法中都这样做吗?谢谢Peter。这似乎是一个很好的解决方案。我还有一个问题。现在如何绑定ValidationMessage的属性?有没有办法根据上下文来做这件事?对不起,我不明白你是什么asking@PeterMorris,在您的代码中,args.FieldIdentifier.FieldName可能返回'FirstProperty',nameofPerson.FirstProperty将返回'FirstProperty'有效。比如说,你有Person.Subclass.FirstProperty。FieldChanged方法中是否有办法区分Person.FirstProperty上的FirstProperty与Person.Subclass.FirstProperty上的FirstProperty?没有。Blazor属性ID基于属性名称和直接拥有的对象。您必须使用FluentValidation并在根目录上手动执行验证才能获得完整路径。您可以在我的Blazor验证库中使用FV。关于第2点InvokeAsyncStateHasChanged,我们是否必须在所有异步方法中使用FV?谢谢Peter。这似乎是一个很好的解决方案。我还有一个问题。现在如何绑定ValidationMessage的属性?有没有办法根据上下文来做这件事?对不起,我不明白你是什么asking@PeterMorris,在您的代码中,args.FieldIdentifier.FieldName可能返回'FirstProperty',nameofPerson.FirstProperty将返回'FirstProperty'有效。比如说,你有Person.Subclass.FirstProperty。FieldChanged方法中是否有办法区分Person.FirstProperty上的FirstProperty与Person.Subclass.FirstProperty上的FirstProperty?没有。Blazor属性ID基于属性名称和直接拥有的对象。您必须使用FluentValidation并在根目录上手动执行验证才能获得完整路径。您可以在我的Blazor验证库中使用FV。
var fd = new FieldIdentifier(Model.Address, nameof(Address.PostalCode));
MyEditContext.NotifyFieldChanged(fd);