首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >服务器端Blazor验证不更新UI

服务器端Blazor验证不更新UI
EN

Stack Overflow用户
提问于 2020-04-13 16:01:05
回答 3查看 1.5K关注 0票数 3

我有一个表示表单的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上。

我的组件看起来如下:

代码语言:javascript
运行
复制
<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更新,也没有显示验证消息。我也尝试过这个组件:

代码语言:javascript
运行
复制
<ValidationSummary Model="@form" />

都没有用。

服务器上或客户端JS上都没有错误。

我是用这种方法撞错了树,还是错过了某个地方的连接?有更好的方法来完成我想做的事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-13 18:35:28

创建(并更新)一个没有附加到UI表单的EditContext。

将第一行改为(注:无模型):

代码语言:javascript
运行
复制
 <EditForm EditContext="editContext"  OnValidSubmit="Submit">

您的其余代码可以保持原样,不需要StateHasChanged()或任何东西。

在链接到的第一个文档页上,搜索"_editContext"

票数 2
EN

Stack Overflow用户

发布于 2020-04-13 17:16:52

验证后调用StateHasChanged

代码语言:javascript
运行
复制
    private async Task Submit()
    {
        var isValid = editContext.Validate() && await ServerValidate(editContext);
        if (isValid) 
        { 
            // do stuff 
        }
        StateHasChanged();
    }

注意:或者在editContext.NotifyValidationStateChanged()中调用它,如果您可以访问那里的组件。

票数 1
EN

Stack Overflow用户

发布于 2020-04-22 07:02:55

亨克的回答是正确的。几个新的

  1. <DataAnnotationsValidator /><ValidationSummary />添加到<EditForm>下面,用于模型注释驱动的单个字段验证,并在需要的情况下形成汇总错误消息(除每个字段上的表单外)。
  2. 一旦将消息添加到字段(validationErrors.Add(field, "This data point already exists, please type a different one");),该消息将持续存在,而未来的Submit将被忽略为无效。
  3. 只有OnInvalidSubmit()会在此时触发,因为上面的验证错误及其与OnValidSubmit()的配对。需要清除错误,以便进行正常处理。
  4. 我只找到了一种强力的方法来清除错误,那就是使用ClearError()方法重新初始化EditContext
代码语言:javascript
运行
复制
    public void ClearErrors()
    {
        _editContext = new EditContext(form);
        isSubmitButtonDisabled = false;
        showClearErrors = false;
    }

然后,我将其连接到一个按钮中,在showClearErrors=true时显示该按钮并禁用Submit按钮。如果有更好的方法来消除错误,我会全神贯注的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61191793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档