为隐藏属性

时间:2017-11-10 20:30:04

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-3

我有一个名为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)
   {
       ....
   }
}

感谢您的解释和想法。

0 个答案:

没有答案
相关问题