Razor Pages中BindProperty绑定对象的只读属性在OnPost执行前被调用问题
只读属性被自动调用的原因
从你提供的堆栈跟踪可以明确看到,调用来自ASP.NET Core的模型验证流程:默认的DefaultComplexObjectValidationStrategy会遍历绑定模型的所有公共属性,无论属性是否只读、是否标注了验证特性,验证系统都会先读取属性值,判断是否需要执行后续验证逻辑,这就是IsEmpty的getter在OnPost执行前被触发的原因。
阻止自动调用的解决方案
方案1:添加[ValidateNever]特性(最推荐)
直接在IsEmpty属性上标注ASP.NET Core内置的[ValidateNever]特性,验证系统会完全跳过该属性的所有验证流程,不会主动调用其getter,对后续手动调用该属性没有任何影响。
代码示例:
using Microsoft.AspNetCore.Mvc; public class TripSearchModel { // 绑定属性定义... [ValidateNever] public bool IsEmpty { get { // 校验数据,无内容时返回true } } }
方案2:将只读属性改为方法
模型验证系统只会扫描公共属性,不会主动调用类的方法,你可以把IsEmpty改成无参方法即可避免被自动调用:
public class TripSearchModel { // 绑定属性定义... public bool IsEmpty() { // 校验数据,无内容时返回true } }
后续你手动调用的地方改成Search.IsEmpty()即可,逻辑完全不变。
方案3:自定义验证策略(不推荐)
如果你有大量同类只读属性需要跳过验证,可以自定义全局的复杂对象验证策略,过滤掉所有无setter的只读属性,但改造成本较高,仅适合批量处理的场景。
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

