如何使用Blazor服务器在EditContext中正确处理验证消息

问题描述 投票:0回答:3

我正在将RazorPages应用程序转换为渲染的Blazor服务器,该应用程序实际上只是一个UI,所有数据访问/操作都是通过API完成的。在CRUD操作中,API将以标准化格式返回错误对象的集合。

我在RazorPages应用程序中具有代码,可以将错误的集合转换为ModelStateDictionary中的项,并且可以按预期工作。显示消息,我可以进行更改并重新提交表单。

我已经在Blazor应用程序中添加了类似的代码以添加到EditContext中,但是我正在努力弄清楚如何清除由扩展方法添加的验证消息。我一直在看这个问题,并提出了所有解决方案,但似乎没有一个对我有用:How to reset custom validation errors when using editform in blazor razor page

这是实际执行EditContext的方法:

        private static void AddErrors(EditContext editContext, Dictionary<string, List<string>> errorDictionary)
        {
            if (errorDictionary != null && errorDictionary.Any())
            {
                var validationMessageStore = new ValidationMessageStore(editContext);

                foreach (var error in errorDictionary)
                {
                    validationMessageStore.Add(editContext.Field(error.Key), error.Value);
                }

                editContext.NotifyValidationStateChanged();
            }
        }

这是表单定义:

        <EditForm class="form-signin" OnValidSubmit="OnSubmit" Model="loginModel" Context="CurrentEditContext">
            <DataAnnotationsValidator />
            <SummaryOnlyValidationSummary />

            <div class="form-group">
                <InputText id="inputUsername" class="form-control" @bind-Value="loginModel.Username" autofocus placeholder="Username" @onkeyup="@(q => ResetValidation(CurrentEditContext))" />
                <ValidationMessage For="@(() => loginModel.Username)" />
            </div>

            <div class="form-group">
                <InputText type="password" id="inputPassword" class="form-control" placeholder="Password" @bind-Value="loginModel.Password" />
                <ValidationMessage For="@(() => loginModel.Password)" />
            </div>

            <div class="form-group">
                <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
            </div>
        </EditForm>

这是提交表单时的方法签名,根据包含的验证消息,传递的editContext看起来正确(来自模型属性的Required属性的消息正确):

protected async Task OnSubmit(EditContext editContext)

SummaryOnlyValidationSummary是一个自定义组件,其工作原理与开箱即用的ValidationSummary相似,但它排除了DataAnnotationsValidator已经显示的任何消息。>

我是否以错误的方式添加消息?如果是这样,是否有关于我哪里出问题的良好指导?如果不是,是否有人知道如何正确清除或重置验证消息?我试图总是提交表单,不仅在表单有效时,甚至强迫editContext.Validate()都不会清除代码中添加的验证消息。如果有帮助,请在ResetValidation中,在当前editContext之外创建一个新的ValidationMessageStore实例,并且该实例不包含任何消息(不确定所期望的行为是什么)。

我正在将RazorPages应用程序转换为渲染的Blazor服务器,该应用程序实际上只是一个UI,所有数据访问/操作都是通过API完成的。在CRUD操作中,API将......>

c# validation .net-core blazor blazor-server-side
3个回答
0
投票

以下是我在github 中发布的问题:

我知道如何通过EditContext检索验证消息,但是如何获取ValidationMessageStore,读取其包含的消息并对其进行一些更改。


0
投票

基于此找到了可行的解决方案:

https://remibou.github.io/Using-the-Blazor-form-validation/


0
投票

我只是无法获得要在更新模型时清除的内容

© www.soinside.com 2019 - 2024. All rights reserved.