我有一个ASP.NET MVC 2项目,我在其中创建了一个数据传输对象,用于从网页表单接收数据.表单上有两组复选框.我想验证对象以确保每个组中至少有一个复选框被选中.
我正在服务器端进行验证,以便用户无法破解任何客户端验证. (稍后我将使用jQuery添加客户端验证;这很简单.)
我的理解是我必须为我的数据传输对象类创建自己的自定义ValidationAttribute,但我不明白如何创建和使用一个可以接受任意复选框属性列表的类,以确保其中至少有一个是真正.我猜我必须调用这样的属性:
- [AtLeastOneCheckBox("set1check1","set1check2","set1check3",ErrorMessage = "You must check at least one checkBox in set 1.")]
- [AtLeastOneCheckBox("set2check1","set2check2","set2check3","set2check4","set2check5",ErrorMessage = "You must check at least one checkBox in set 2.")]
- public class MyFormDTO
- {
- ...
- }
AtLeastOneCheckBoxAttribute的实现是什么样的?
或者有不同的方式我应该做这种验证?
解决方法
如果您有多个复选框组,则只需要多次定义该属性.
- [AttributeUsage( AttributeTargets.Class)]
- public class AtLeastOneCheckBoxAttribute : ValidationAttribute
- {
- private string[] _checkBoxNames;
- public AtLeastOneCheckBoxAttribute(params string[] checkBoxNames)
- {
- _checkBoxNames = checkBoxNames;
- }
- protected override ValidationResult IsValid(object value,ValidationContext validationContext)
- {
- var propertyInfos = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)
- .Where(x=>_checkBoxNames.Contains(x.Name));
- var values = propertyInfos.Select(x => x.GetGetMethod().Invoke(value,null));
- if (values.Any(x => Convert.ToBoolean(x)))
- return ValidationResult.Success;
- else
- {
- ErrorMessage = "At least one checkBox must be selected";
- return new ValidationResult(ErrorMessage);
- }
- }
- }
UPDATE