服务器端Blazor验证未更新UI
我有一个Blazor组件表示表单,在提交之前需要执行一些昂贵的验证,以确保服务器上数据点的唯一性。我试图将此文档用作灵感: Microsoft文档路线图上似乎有更好的文档: 我的组件如下所示:服务器端Blazor验证未更新UI,blazor,Blazor,我有一个Blazor组件表示表单,在提交之前需要执行一些昂贵的验证,以确保服务器上数据点的唯一性。我试图将此文档用作灵感: Microsoft文档路线图上似乎有更好的文档: 我的组件如下所示: <EditForm Model="@form" OnValidSubmit="@Submit"> <InputText @bind-Value="form.DataPoint" /> <ValidationMessage For="() => form.
<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;
}
}
走!
@代码{
私有表单=新表单();
私有编辑上下文编辑上下文;
受保护的覆盖无效OnInitialized()
{
editContext=新的editContext(表单);
}
专用异步任务提交()
{
var isValid=editContext.Validate()&等待服务器验证(editContext);
如果(有效)
{
//做事
}
}
专用异步任务服务器验证(EditContext EditContext)
{
var form=(form)editContext.Model;
var validationErrors=新的ValidationMessageStore(editContext);
var isDataPointCollision=wait SomeService.checkuniversity(form.DataPoint);
if(isDataPointCollision)
{
变量字段=新的字段标识符(form,nameof(form.DataPoint));
添加(字段“此数据点已存在,请键入其他数据点”);
editContext.NotifyValidationStateChanged();
返回false;
}
返回true;
}
}
我的验证代码工作正常,检测到冲突,并阻止提交表单。但是,UI并没有按照预期使用
组件进行更新。根本不会发生UI更新,也不会显示任何验证消息。我也尝试过这个组件:
<ValidationSummary Model="@form" />
无济于事
服务器上或客户端JS中都没有错误
我是不是用这种方法找错了方向,还是我错过了某个地方的连接?有没有更好的方法来完成我想做的事情?验证后打电话:
private async Task Submit()
{
var isValid = editContext.Validate() && await ServerValidate(editContext);
if (isValid)
{
// do stuff
}
StateHasChanged();
}
注意:如果您有权访问组件,也可以在editContext.NotifyValidationStateChanged()
中调用它。您创建(并更新)一个未附加到UI表单的editContext
将第一行更改为(注意:无型号):
代码的其余部分可以保持原样,不需要StateHasChanged()或其他任何东西
在链接到的第一个文档页面上,搜索
“\u editContext”
Henk的答案是正确的。一些补充
和
以下的
,并根据需要形成汇总错误消息(除每个字段上的信息外,还包括表单上的信息)validationErrors.Add(字段,“此数据点已存在,请键入其他数据点”);
)后,消息将保持不变,并且以后提交的内容将被视为无效而忽略OnValidSubmit()
的配对,此时只有OnInvalidSubmit()
将触发。需要清除错误才能继续正常处理clearror()
方法重新初始化EditContext
:然后,我将其连接到一个按钮中,该按钮在
showClearErrors=true
时显示,并禁用Submit按钮。如果有更好的方法来清除错误,我洗耳恭听。谢谢你的回答。然而,这并不会导致任何不同的行为。这就是答案。感谢Henk-我误读了文档中的示例,没有注意到表单与编辑上下文关联,而不是直接与模型关联。
<EditForm EditContext="editContext" OnValidSubmit="Submit">
public void ClearErrors()
{
_editContext = new EditContext(form);
isSubmitButtonDisabled = false;
showClearErrors = false;
}