asp.net-mvc – 一个ASP.NET MVC验证器,用于确保至少选中一个复选框

我有一个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

如您所知,只有在所有属性都通过后才会调用类级别验证.为了得到错误,只需使用空字符串作为键.

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...