Asp.Net Core 2:提交表单时绑定对象为空但ModelState有效
解决BindProperty对象Post后为空但ModelState.IsValid为true的问题
这个问题我之前也碰到过,核心原因其实出在你的Group属性的setter访问权限上!
问题根源
你定义的属性是这样的:
[BindProperty] public Group Group { get; private set; }
ASP.NET Core的模型绑定系统需要属性拥有公共的setter才能完成赋值操作,private set会导致绑定系统无法写入数据到这个属性里。虽然ModelState.IsValid显示为true,但这只是因为绑定系统没尝试对这个私有set的属性进行绑定(或者说没有检测到与之关联的绑定错误),所以才会出现“验证有效但对象为空”的矛盾情况。
而你在OnGetAsync里能正常填充Group,是因为你是在PageModel类内部进行赋值,private set在类内部是允许访问的,所以这个环节没问题。
解决方案
把Group属性的setter改成public即可:
[BindProperty] public Group Group { get; set; }
额外检查点
如果修改后还是存在问题,建议确认表单中的输入控件是否正确关联到Group的属性:
- 使用标签助手
asp-for来生成输入框,比如<input asp-for="Group.Name" />,这样能确保生成的name属性和模型属性完全匹配,绑定系统才能正确识别并赋值。 - 可以在
OnPostAsync里打印ModelState的所有条目,检查是否有隐藏的绑定错误(比如某个字段格式不匹配,但没触发全局验证)。
内容的提问来源于stack exchange,提问作者Hecatonchires
相关产品推荐
相关产品推荐

