我有一个表示表单的Blazor组件,它需要在提交之前执行一些昂贵的验证,以确保服务器上数据点的唯一性。我试着用这个文档作为灵感:https://learn.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-3.1
似乎更好的文档是在Microsoft文档路线图:https://github.com/dotnet/AspNetCore.Docs/issues/17377上。
我的组件看起来如下:
<EditForm Model="@form" OnValidSubmit="@Submit">
<InputText @bind-Value="form.DataPoint" />
<ValidationMessage For="() => form.DataPoint" />
<button type="submit">Go!</button>
</EditForm>
@code {
private Form form = new Form();
private EditContext editContext;
protected override void OnInitialized()
{
editContext = new EditContext(form);
}
private async Task Submit()
{
var isValid = editContext.Validate() && await ServerValidate(editContext);
if (isValid)
{
// do stuff
}
}
private async Task<bool> ServerValidate(EditContext editContext)
{
var form = (Form)editContext.Model;
var validationErrors = new ValidationMessageStore(editContext);
var isDataPointCollision = await SomeService.CheckUniqueness(form.DataPoint);
if (isDataPointCollision)
{
var field = new FieldIdentifier(form, nameof(Form.DataPoint));
validationErrors.Add(field, "This data point already exists, please type a different one");
editContext.NotifyValidationStateChanged();
return false;
}
return true;
}
}我的验证代码工作正常,检测冲突,防止表单提交。但是,UI并没有按照预期使用<ValidationMessage [...] />组件进行更新。根本不发生UI更新,也没有显示验证消息。我也尝试过这个组件:
<ValidationSummary Model="@form" />都没有用。
服务器上或客户端JS上都没有错误。
我是用这种方法撞错了树,还是错过了某个地方的连接?有更好的方法来完成我想做的事吗?
发布于 2020-04-13 18:35:28
创建(并更新)一个没有附加到UI表单的EditContext。
将第一行改为(注:无模型):
<EditForm EditContext="editContext" OnValidSubmit="Submit">您的其余代码可以保持原样,不需要StateHasChanged()或任何东西。
在链接到的第一个文档页上,搜索"_editContext"
https://stackoverflow.com/questions/61191793
复制相似问题