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

Blazor服务端(.NET 6)实现数字录入重复条目校验的方案咨询

Blazor服务端(.NET 6)实现数字录入重复条目校验的方案咨询

嗨,我来帮你搞定这个重复数字校验的问题!你现在已经有了入库的基础功能,核心就是要从前端体验优化和后端数据安全两方面入手,确保不会出现重复条目,我给你梳理几个可行的方案:

一、前端即时校验(提升用户体验)

可以在用户输入数字的过程中,实时查询数据库判断是否已存在,立刻给出提示。修改你的Razor页面代码:

<EditForm Model="@veh" OnValidSubmit="SaveNumber">
    <DataAnnotationsValidator />
    <div class="mb-3">
        <label for="number" class="form-label">Number</label>
        <div class="col-md-4">
            <InputText class="form-control" @bind-Value="veh.Number" 
                       @onchange="CheckDuplicateNumber" placeholder="请输入1-7位数字" />
            <!-- 显示重复错误提示 -->
            <ValidationMessage For="@(() => veh.Number)" />
        </div>
    </div>
    <button type="submit" class="btn btn-primary">提交</button>
</EditForm>

然后在你的AddNumberModel类里添加校验逻辑:

// 假设你有封装好的数据访问服务,比如INumberService
private readonly INumberService _numberService;
private string _duplicateErrorMessage;

// 通过构造函数注入服务
public AddNumberModel(INumberService numberService)
{
    _numberService = numberService;
}

// 实时校验重复的方法
private async Task CheckDuplicateNumber(ChangeEventArgs e)
{
    var inputNumber = e.Value?.ToString().Trim();
    if (!string.IsNullOrEmpty(inputNumber))
    {
        // 调用服务查询数据库是否存在该数字
        var isDuplicate = await _numberService.IsNumberExistsAsync(inputNumber);
        if (isDuplicate)
        {
            _duplicateErrorMessage = "这个数字已经存在啦,请换一个!";
        }
        else
        {
            _duplicateErrorMessage = null;
        }
        // 通知验证状态更新,让错误提示显示/消失
        EditContext?.NotifyValidationStateChanged();
    }
}

// 你的数字模型类,加上基础校验规则
public class VehicleNumberModel
{
    [Required(ErrorMessage = "请输入数字")]
    [StringLength(7, MinimumLength = 1, ErrorMessage = "数字长度必须在1-7位之间")]
    public string Number { get; set; }
}

// 重写模型验证,把重复校验加入进去
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    foreach (var result in base.Validate(validationContext))
    {
        yield return result;
    }

    if (!string.IsNullOrEmpty(_duplicateErrorMessage))
    {
        yield return new ValidationResult(_duplicateErrorMessage, new[] { nameof(veh.Number) });
    }
}

二、后端双重校验(保障数据安全)

前端校验只是提升体验,不能完全依赖(比如有人绕过前端直接调用接口),所以必须在入库前再做一次校验:

public async Task SaveNumber()
{
    if (!ModelState.IsValid)
    {
        return;
    }

    // 再次校验数字是否存在
    var isDuplicate = await _numberService.IsNumberExistsAsync(veh.Number.Trim());
    if (isDuplicate)
    {
        ModelState.AddModelError(nameof(veh.Number), "该数字已存在,请重新输入!");
        return;
    }

    // 执行你的入库逻辑
    try
    {
        await _numberService.AddNumberAsync(veh);
        // 入库成功后跳转到列表页
        NavigationManager.NavigateTo("/list");
    }
    catch (DbUpdateException ex)
    {
        // 额外加一层数据库唯一约束的异常捕获(兜底)
        if (ex.InnerException is SqlException sqlEx && sqlEx.Number == 2601) // SQL Server的唯一约束冲突错误码
        {
            ModelState.AddModelError(nameof(veh.Number), "该数字已存在,请重新输入!");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "保存失败,请稍后重试!");
        }
    }
}

三、数据库层面兜底(终极保障)

直接给数据库里存储数字的字段加唯一约束,这样就算程序层面的校验都漏了,数据库也会拒绝重复数据,我们只需要捕获对应的异常即可(上面的try-catch已经处理了这个情况)。

这样一套组合拳下来,既让用户在输入时就能得到即时反馈,又从程序和数据库层面双重保障了数据的唯一性,完全满足你的需求~

备注:内容来源于stack exchange,提问作者Rickymail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:08:11