首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

回答已采纳

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

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

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

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

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

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

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61191793

复制
相关文章

相似问题

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