我有一个名为PersonViewModel的C#MVC视图模型,它继承了 IValidatableObject 。有一个名为ClickCount的属性是整数类型。该属性在MVC视图上隐藏,但它用于计算用户点击另一个可见视图元素(html元素)。隐藏属性的要求是正整数。这意味着用户必须至少单击其他html元素1.如果用户没有单击其他html元素,那么当他/她通过名为Save()的MVC控制器POST操作方法将表单提交给服务器时,MVC验证错误应该是被带回视图页面。
验证方法也用于验证我的MVC模型的其他属性,并且忽略了那些验证任务,因为整体忽略了验证方法。
为了强制验证,在我的视图模型PersonViewModel中,我将隐藏属性ClickCount修饰为:
[Range(1, int.MaxValue, ErrorMessage = "The Bell button must be clicked at least 1")]
public int ClickCount { get; set; }
该隐藏属性的装饰是错误的,因为它导致我的MVC模型PersonViewModel 的重写Validation()方法被忽略或从未被击中,调试的ModelState.IsValid总是 true 虽然用户没有点击其他html元素。所以,我不得不删除该隐藏属性的验证属性。相反,我将验证逻辑移到了重写的验证方法中。
我的视图模型的重写Validation方法也包含其他模型属性的验证逻辑。
我的问题:为什么MVC视图标记页面上隐藏属性的验证属性导致Validation方法被忽略?
以下是我的MVC模型,其隐藏属性ClickCount:
的验证属性错误public class PersonViewModel: IValidatableObject
{
[Range(1, int.MaxValue, ErrorMessage = "The Bell button must be clicked at least 1")]
public int ClickCount { get; set; }
}
#region validation
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
…. // logic to validate properties
}
#endregion
}
具有隐藏属性ClickCount的MVC cshtml视图:
@Html.HiddenFor(m => m.ClickCount, null)
我的控制器POST操作方法总是被ModelState.IsValid命中,因为忽略了覆盖的Validation()方法。
public ActionResult Save(PersonViewModel model)
{
if(ModelState.IsValid)
{
....
}
}
感谢您的解释和想法。