服务器端Blazor验证未更新UI

服务器端Blazor验证未更新UI,blazor,Blazor,我有一个Blazor组件表示表单,在提交之前需要执行一些昂贵的验证,以确保服务器上数据点的唯一性。我试图将此文档用作灵感: Microsoft文档路线图上似乎有更好的文档: 我的组件如下所示: <EditForm Model="@form" OnValidSubmit="@Submit"> <InputText @bind-Value="form.DataPoint" /> <ValidationMessage For="() => form.

我有一个Blazor组件表示表单,在提交之前需要执行一些昂贵的验证,以确保服务器上数据点的唯一性。我试图将此文档用作灵感:

Microsoft文档路线图上似乎有更好的文档:

我的组件如下所示:

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