Bri*_*dig 7 validation asp.net-mvc dto asp.net-mvc-2
我有一个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
{
...
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
如您所知,只有在所有属性都通过后才会调用类级别验证.为了得到错误,只需使用空字符串作为键.
| 归档时间: |
|
| 查看次数: |
9939 次 |
| 最近记录: |