我想使用DataAnnotation
Attribute
告诉用户他必须选中以下两个复选框组中的一个复选框。我的模特是:
//group T
public bool T0 {get;set;}
public bool T1 {get;set;}
public bool T2 {get;set;}
//group P
public bool P0 {get;set;}
public bool P1 {get;set;}
用户必须至少选择一个T
属性和一个P
属性。在某些自定义数据注释中是否有某些功能可以执行此操作,或者我需要从beggining创建一个?
由于
答案 0 :(得分:3)
您可以使用Fluent Validation
[FluentValidation.Attributes.Validator(typeof(CustomValidator))]
public class YourModel
{
public bool T0 { get; set; }
public bool T1 { get; set; }
public bool T2 { get; set; }
}
public class CustomValidator : AbstractValidator<YourModel>
{
public CustomValidator()
{
RuleFor(x => x.T0).NotEqual(false)
.When(t => t.T1.Equals(false))
.When(t => t.T2.Equals(false))
.WithMessage("You need to select one");
}
}
答案 1 :(得分:0)
这里有两种解决方案供您选择使用。
1.使用行动规则:
a)将“False”设置为复选框的默认值。 b)将以下操作规则添加到该复选框字段。
如果check_box_field =“False” 设置check_box_field(本身)=“true”
然后无法取消选中此字段。
2.使用验证规则。将以下验证规则添加到该复选框字段。
如果check_box_field =“False” 显示屏幕提示和消息:“需要检查”
使用此验证规则,如果未选中复选框,将显示验证错误并停止阻止表单提交。如果您有任何疑问,请与我联系。
答案 2 :(得分:0)
我发现这个解决方案按预期工作但我无法在视图上显示错误消息。
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class AtLeastOnePropertyAttribute : ValidationAttribute
{
public AtLeastOnePropertyAttribute(string otherProperties)
{
if (otherProperties == null)
{
throw new ArgumentNullException("otherProperties");
}
OtherProperties = otherProperties;
}
public string OtherProperties { get; private set; }
public string OtherPropertyDisplayName { get; internal set; }
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, OtherPropertyDisplayName ?? OtherProperties);
}
public override bool IsValid(object value)
{
var typeInfo = value.GetType();
var propertiesToGet = OtherProperties.Split(',');
var values = propertiesToGet.Select(propertyName => (bool) typeInfo.GetProperty(propertyName).GetValue(value)).ToList();
return values.Any(v => v);
}
public override object TypeId
{
get
{
return new object();
}
}
}
在DTO课程中:
[AtLeastOneProperty("T0 ,T1,T2", ErrorMessage = @"At least one field should be marked as true.")]
[AtLeastOneProperty("P0,P1", ErrorMessage = @"At least one field should be marked as true.")]
public class TestDTO
{
//Properties
}
答案 3 :(得分:0)