ASP.NET Core Razor Pages隐藏域传Id时ModelState.IsValid为false怎么办
问题原因
Model.IsValid返回false的核心原因有两个:
- OnGet方法没有给绑定属性赋值:
OnGet中查询到了对应Id的图书数据,但没有将查询结果赋值给PageModel上标记了[BindProperty]的Book属性,导致Razor页面渲染时,asp-for="Book.Id"对应的隐藏输入框没有正确的Id值,输出的value为空。表单提交时空字符串无法绑定到int类型的Id字段,触发模型验证失败。 - 验证失败后的跳转逻辑错误:
OnPost验证失败时使用RedirectToPage()触发重定向,会丢失当前的ModelState上下文,导致页面无法显示具体的验证错误信息。
解决方案
按以下步骤修改你的Edit.cshtml.cs代码即可:
1. 修改OnGet方法
将查询到的图书实例赋值给Book属性,同时增加空判断避免无效Id访问:
public async Task<IActionResult> OnGet(int id) { // 将查询结果赋值给绑定属性 Book = await _db.Book.FindAsync(id); if (Book == null) { return NotFound(); } return Page(); }
2. 修改OnPost的失败返回逻辑
验证失败时直接返回当前页面,保留ModelState错误信息供前端展示,同时增加数据库查询结果的空判断:
public async Task<IActionResult> OnPost() { if (ModelState.IsValid) { var bookFromDb = await _db.Book.FindAsync(Book.Id); // 增加空判断避免空引用异常 if (bookFromDb == null) { return NotFound(); } bookFromDb.Title = Book.Title; bookFromDb.Author = Book.Author; bookFromDb.ISBN = Book.ISBN; await _db.SaveChangesAsync(); return RedirectToPage("Index"); } // 验证失败返回当前页面,保留上下文错误信息 return Page(); }
修改完成后页面渲染时隐藏字段会带上正确的Id值,表单提交后模型绑定正常,Model.IsValid就会返回true。
内容的提问来源于stack exchange,提问作者Kiarash Kanani
相关产品推荐
相关产品推荐

