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

ASP.NET Core Razor Pages隐藏域传Id时ModelState.IsValid为false怎么办

问题原因

Model.IsValid返回false的核心原因有两个:

  1. OnGet方法没有给绑定属性赋值:OnGet中查询到了对应Id的图书数据,但没有将查询结果赋值给PageModel上标记了[BindProperty]的Book属性,导致Razor页面渲染时,asp-for="Book.Id"对应的隐藏输入框没有正确的Id值,输出的value为空。表单提交时空字符串无法绑定到int类型的Id字段,触发模型验证失败。
  2. 验证失败后的跳转逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:09:03