C# Blazor获取两个属性的验证消息
我在Blazor服务器端应用程序中有一个简单的EditForm。它有一个绑定属性,该属性更改另一个属性,该属性也应通过表单验证 该表单包含以下部分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
<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);