You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于API返回结果在Blazorise中实现密码重置验证并保留原有校验

问题描述

我开发了一个使用Blazorise的Blazor应用,密码重置对话框功能正常。现在需要在提交密码到服务器时新增校验逻辑:检查该密码是否曾被使用过,若已使用,则在密码输入框下方显示提示信息。请问如何在Blazorise的Validation组件中实现该功能,同时保留原有的密码格式校验及确认密码匹配校验?

密码重置对话框界面:
密码重置对话框

当前代码实现:

<Fields>
    <Field ColumnSize="ColumnSize.Is6">
        <FieldLabel RequiredIndicator>密码</FieldLabel>
        <Validation Validator="@ValidatePassword">
            <TextEdit @bind-Text="@User.Password" Placeholder="输入密码" MaxLength="50" Role="TextRole.Password">
                <Feedback>
                    <ValidationError>无效密码。密码长度需在8-30字符之间,包含至少一个数字、一个小写字母、一个大写字母和一个特殊字符。</ValidationError>
                </Feedback>
            </TextEdit>
        </Validation>
    </Field>
</Fields>
<Fields>
    <Field ColumnSize="ColumnSize.Is6">
        <FieldLabel RequiredIndicator>确认密码</FieldLabel>
        <Validation Validator="@ConfirmPassword">
            <TextEdit @bind-Text="@User.ConfirmPassword" Placeholder="重新输入密码" MaxLength="50" Role="TextRole.Password">
                <Feedback>
                    <ValidationError>密码不匹配!</ValidationError>
                </Feedback>
            </TextEdit>
        </Validation>
    </Field>
</Fields>
@code {
const string passwordPattern = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,30}$";

    void ValidatePassword(ValidatorEventArgs e)
    {
        bool isMatch = Regex.IsMatch(Convert.ToString(e.Value), passwordPattern);
        e.Status = isMatch ? ValidationStatus.Success : ValidationStatus.Error;
    }

    void ConfirmPassword(ValidatorEventArgs e)
    {
        var confirmPassword = Convert.ToString(e.Value);
        bool isMatch = Regex.IsMatch(confirmPassword, passwordPattern);
        if (!isMatch)
        {
            e.Status = ValidationStatus.Error;
            e.ErrorText = "无效密码。密码长度需在8-30字符之间,包含至少一个数字、一个小写字母、一个大写字母和一个特殊字符。";
        }
        else if (confirmPassword != User.Password)
        {
            e.Status = ValidationStatus.Error;
        }
        else
        {
            e.Status = ValidationStatus.Success;
        }
    }
}

解决方案

要新增密码历史校验并保留原有逻辑,需利用Blazorise的异步验证能力(检查历史密码需调用服务器接口),具体调整如下:

1. 准备服务器校验服务

假设你已实现一个服务用于检查密码是否曾被使用,示例接口定义:

public interface IPasswordService
{
    Task<bool> IsPasswordUsedBeforeAsync(string userId, string password);
}

在组件中注入该服务:

@inject IPasswordService PasswordService

2. 修改密码验证方法为异步

将原同步验证方法改为异步,先执行格式校验,通过后调用服务器接口检查历史密码,动态设置错误文本:

const string passwordPattern = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,30}$";

async Task ValidatePassword(ValidatorEventArgs e)
{
    var password = Convert.ToString(e.Value);
    // 1. 原有格式校验
    bool isFormatValid = Regex.IsMatch(password, passwordPattern);
    if (!isFormatValid)
    {
        e.Status = ValidationStatus.Error;
        e.ErrorText = "无效密码。密码长度需在8-30字符之间,包含至少一个数字、一个小写字母、一个大写字母和一个特殊字符。";
        return;
    }

    // 2. 调用服务器检查密码是否曾被使用
    bool isPasswordUsed = await PasswordService.IsPasswordUsedBeforeAsync(User.Id, password);
    if (isPasswordUsed)
    {
        e.Status = ValidationStatus.Error;
        e.ErrorText = "该密码已被使用,请选择新密码。";
    }
    else
    {
        e.Status = ValidationStatus.Success;
    }
}

3. 调整Validation组件支持动态错误提示

Blazorise的Validation组件默认支持异步验证,只需将Validator绑定到异步方法,并把固定错误文本改为动态绑定@context.ErrorText:

<Fields>
    <Field ColumnSize="ColumnSize.Is6">
        <FieldLabel RequiredIndicator>密码</FieldLabel>
        <Validation Validator="@ValidatePassword">
            <TextEdit @bind-Text="@User.Password" Placeholder="输入密码" MaxLength="50" Role="TextRole.Password">
                <Feedback>
                    <ValidationError>@context.ErrorText</ValidationError>
                </Feedback>
            </TextEdit>
        </Validation>
    </Field>
</Fields>

4. 优化确认密码校验逻辑

保留原有校验逻辑,统一错误文本格式,同样改为动态绑定:

void ConfirmPassword(ValidatorEventArgs e)
{
    var confirmPassword = Convert.ToString(e.Value);
    bool isFormatValid = Regex.IsMatch(confirmPassword, passwordPattern);
    if (!isFormatValid)
    {
        e.Status = ValidationStatus.Error;
        e.ErrorText = "无效密码。密码长度需在8-30字符之间,包含至少一个数字、一个小写字母、一个大写字母和一个特殊字符。";
    }
    else if (confirmPassword != User.Password)
    {
        e.Status = ValidationStatus.Error;
        e.ErrorText = "密码不匹配!";
    }
    else
    {
        e.Status = ValidationStatus.Success;
    }
}

对应调整确认密码的Validation组件:

<Fields>
    <Field ColumnSize="ColumnSize.Is6">
        <FieldLabel RequiredIndicator>确认密码</FieldLabel>
        <Validation Validator="@ConfirmPassword">
            <TextEdit @bind-Text="@User.ConfirmPassword" Placeholder="重新输入密码" MaxLength="50" Role="TextRole.Password">
                <Feedback>
                    <ValidationError>@context.ErrorText</ValidationError>
                </Feedback>
            </TextEdit>
        </Validation>
    </Field>
</Fields>

5. 可选:添加校验加载状态

为提升用户体验,可在异步校验时显示加载提示:

<Validation Validator="@ValidatePassword">
    <TextEdit @bind-Text="@User.Password" Placeholder="输入密码" MaxLength="50" Role="TextRole.Password">
        <Feedback>
            <ValidationError>@context.ErrorText</ValidationError>
            <Loading IsVisible="@context.IsValidating">正在校验密码...</Loading>
        </Feedback>
    </TextEdit>
</Validation>

内容的提问来源于stack exchange,提问作者Age of Empires

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:53:08