当我希望至少有一个复选框值为真时,如何检查 Model.IsValid 是否为真?
How can I check if Model.IsValid when I want to have at least one checkbox value be true?
我有一个有很多复选框的模型。仅当至少选中其中一个框并选择了日期时,此模型才有效。该模型如下所示:
public class CustomDistricts4Weeks
{
[DisplayName("002")]
public bool D2 { get; set; }
[DisplayName("003")]
public bool D3 { get; set; }
[DisplayName("004")]
public bool D4 { get; set; }
[DisplayName("005")]
public bool D5 { get; set; }
[DisplayName("006")]
public bool D6 { get; set; }
[DisplayName("007")]
public bool D7 { get; set; }
[DisplayName("ARL")]
public bool DArl { get; set; }
[DisplayName("BAR")]
public bool DBar { get; set; }
[DisplayName("COL")]
public bool DCol { get; set; }
[DisplayName("GER")]
public bool DGer { get; set; }
[DisplayName("MEM")]
public bool DMem { get; set; }
[DisplayName("LAK")]
public bool DLak { get; set; }
[DisplayName("MIL")]
public bool DMil { get; set; }
[DisplayName("JAIL")]
public bool DJail { get; set; }
[DisplayName("JAILEAST")]
public bool DJailEast { get; set; }
[DisplayName("SCCC")]
public bool DSCCC { get; set; }
[DisplayName("1USD")]
public bool D1USD { get; set; }
[DisplayName("2USD")]
public bool D2USD { get; set; }
[DataType(DataType.Date, ErrorMessage = "Date Only")]
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = true)]
[Display(Name = "To Date")]
public DateTime ToDate { get; set; }
}
我确定我可以将 [Required] 放在 ToDate 上,但我如何才能确保至少有一个布尔值是真的?任何数字都可以为真,但至少有一个必须为真。我可能没有正确处理这个问题,我很想学习更好的方法。我的代码正在运行,但我正在尝试构建验证。
定义自定义验证属性并将其应用于 class。
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ModelValidationAttribute : ValidationAttribute
{
public ModelValidationAttribute(string errorMessage)
: base(errorMessage)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (validationContext.ObjectInstance is CustomDistricts4Weeks model)
{
if (model.D2 || model.D3 || model.D4 ...)
{
return ValidationResult.Success;
}
}
return new ValidationResult(ErrorMessage);
}
}
将 ModelValidationAttribute
属性应用于数据模型 class:
[ModelValidation("Select at least one checkbox")]
public class CustomDistricts4Weeks
{
[DisplayName("002")]
public bool D2 { get; set; }
...
}
自定义属性的 IsValid()
方法可能会更改为使用反射来枚举模型中的所有属性。在这种情况下,不需要使用所有属性名称。当然,只有在所有 bool
属性都应该被测试的情况下:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = (Movie)validationContext.ObjectInstance;
PropertyInfo[] myPropertyInfo = model.GetType().GetProperties();
for (int i = 0; i < myPropertyInfo.Length; i++)
{
var prop = myPropertyInfo[i];
if (prop.PropertyType.Equals(typeof(bool))
&& prop.GetCustomAttributes(typeof(DisplayNameAttribute), false).Length > 0
&& prop.GetValue(model) is bool pval && pval)
{
return ValidationResult.Success;
}
}
return new ValidationResult(ErrorMessage);
}
我有一个有很多复选框的模型。仅当至少选中其中一个框并选择了日期时,此模型才有效。该模型如下所示:
public class CustomDistricts4Weeks
{
[DisplayName("002")]
public bool D2 { get; set; }
[DisplayName("003")]
public bool D3 { get; set; }
[DisplayName("004")]
public bool D4 { get; set; }
[DisplayName("005")]
public bool D5 { get; set; }
[DisplayName("006")]
public bool D6 { get; set; }
[DisplayName("007")]
public bool D7 { get; set; }
[DisplayName("ARL")]
public bool DArl { get; set; }
[DisplayName("BAR")]
public bool DBar { get; set; }
[DisplayName("COL")]
public bool DCol { get; set; }
[DisplayName("GER")]
public bool DGer { get; set; }
[DisplayName("MEM")]
public bool DMem { get; set; }
[DisplayName("LAK")]
public bool DLak { get; set; }
[DisplayName("MIL")]
public bool DMil { get; set; }
[DisplayName("JAIL")]
public bool DJail { get; set; }
[DisplayName("JAILEAST")]
public bool DJailEast { get; set; }
[DisplayName("SCCC")]
public bool DSCCC { get; set; }
[DisplayName("1USD")]
public bool D1USD { get; set; }
[DisplayName("2USD")]
public bool D2USD { get; set; }
[DataType(DataType.Date, ErrorMessage = "Date Only")]
[DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = true)]
[Display(Name = "To Date")]
public DateTime ToDate { get; set; }
}
我确定我可以将 [Required] 放在 ToDate 上,但我如何才能确保至少有一个布尔值是真的?任何数字都可以为真,但至少有一个必须为真。我可能没有正确处理这个问题,我很想学习更好的方法。我的代码正在运行,但我正在尝试构建验证。
定义自定义验证属性并将其应用于 class。
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ModelValidationAttribute : ValidationAttribute
{
public ModelValidationAttribute(string errorMessage)
: base(errorMessage)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (validationContext.ObjectInstance is CustomDistricts4Weeks model)
{
if (model.D2 || model.D3 || model.D4 ...)
{
return ValidationResult.Success;
}
}
return new ValidationResult(ErrorMessage);
}
}
将 ModelValidationAttribute
属性应用于数据模型 class:
[ModelValidation("Select at least one checkbox")]
public class CustomDistricts4Weeks
{
[DisplayName("002")]
public bool D2 { get; set; }
...
}
自定义属性的 IsValid()
方法可能会更改为使用反射来枚举模型中的所有属性。在这种情况下,不需要使用所有属性名称。当然,只有在所有 bool
属性都应该被测试的情况下:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = (Movie)validationContext.ObjectInstance;
PropertyInfo[] myPropertyInfo = model.GetType().GetProperties();
for (int i = 0; i < myPropertyInfo.Length; i++)
{
var prop = myPropertyInfo[i];
if (prop.PropertyType.Equals(typeof(bool))
&& prop.GetCustomAttributes(typeof(DisplayNameAttribute), false).Length > 0
&& prop.GetValue(model) is bool pval && pval)
{
return ValidationResult.Success;
}
}
return new ValidationResult(ErrorMessage);
}