ASP.NET Razor Pages ATM信用卡余额查询校验错误排查求助
问题根源
你当前的OnPost处理逻辑仅校验了输入字段的格式合法性(比如必填项是否为空、长度是否符合要求),完全没有对接数据库做账号信息匹配校验,只要输入符合字段规则就会直接跳转到User页,这是问题的核心原因。
修复步骤
1. 修改Index.cshtml.cs的提交处理逻辑
替换原有OnPost方法的代码即可:
public IActionResult OnPost() { // 先校验输入格式是否合法 if (!ModelState.IsValid) { return Page(); } // 对接数据库查询匹配的账号 var matchedAccount = _db.Accounts.FirstOrDefault(a => a.Name == Account.Name.Trim() && a.Surname == Account.Surname.Trim() && a.Pin == Account.Pin); // 匹配成功跳转到用户页,同时传递账号ID用于查询余额 if (matchedAccount != null) { return RedirectToPage("User", new { id = matchedAccount.Id }); } // 匹配失败添加错误提示,返回当前页 ModelState.AddModelError(string.Empty, "姓名、姓氏或PIN码输入错误,请重新核对后提交"); return Page(); }
如果需要忽略姓名/姓氏的大小写匹配,可以将对应匹配条件改为a.Name.Equals(Account.Name.Trim(), StringComparison.OrdinalIgnoreCase)即可。
2. 补充User页的逻辑(用于展示余额)
你目前只贴了User页的前端代码,需要先补充后端逻辑(User.cshtml.cs):
using BanlAcc.Model; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.EntityFrameworkCore; namespace BanlAcc.Pages.BankAcc { public class AccountModel : PageModel { private readonly ApplicationDbContext _db; public AccountModel(ApplicationDbContext db) { _db = db; } public Account UserAccount { get; set; } public async Task<IActionResult> OnGetAsync(int id) { UserAccount = await _db.Accounts.FindAsync(id); if (UserAccount == null) { return RedirectToPage("Index"); } return Page(); } } }
再修改User.cshtml前端展示内容:
@page @model BanlAcc.Pages.BankAcc.AccountModel <br /> <h2 class="text-info">欢迎您,@Model.UserAccount.Name @Model.UserAccount.Surname</h2> <h3>当前卡内余额:@Model.UserAccount.Amount 元</h3>
安全提示
PIN码属于敏感信息,生产环境切勿明文存储在数据库中,建议使用BCrypt等加密算法做哈希存储,校验时将用户输入的PIN码做哈希后再和数据库存储值比对,避免信息泄露风险。
内容的提问来源于stack exchange,提问作者Kifo
相关产品推荐
相关产品推荐

