我有一对单选按钮列表(是/否):
Q1.(Y)(N)
Q2.(Y)(N)
Q3.(Y)(N)
Q4.(Y)(N)
我的模型中有一个属性
public string MedicalExplanation { get; set; }
我的目标是在任何单选按钮设置为true时进行说明。
我的第一次尝试是使用[Required]
,但它不处理条件。
然后我决定使用第三方工具,如MVC Foolproof Validation
我用它是这样的:
[RequiredIf("Q1", true, ErrorMessage = "You must explain any \"Yes\" answers!")]
现在的问题是,如果检查了其他Q2,Q3,Q4,我不知道怎么做。
请咨询
答案 0 :(得分:15)
在您的ViewModel中,创建一个像这样的bool propery:
public bool IsMedicalExplanationRequired
{
get
{
return Q1 || Q2 || Q3 || Q4;
}
}
然后,使用您的RequiredIf属性,如下所示:
[RequiredIf("IsMedicalExplanationRequired", true, ErrorMessage = "You must explain any \"Yes\" answers!")]
更新:
如果您的Q1-Q4属性属于bool?
类型,只需更改IsMedicalExplanationRequired属性,如下所示:
public bool IsMedicalExplanationRequired
{
get
{
return Q1.GetValueOrDefault() || Q2.GetValueOrDefault() || Q3.GetValueOrDefault() || Q4.GetValueOrDefault();
}
}
答案 1 :(得分:3)
我就这样做了:
首先,我创建了一个自定义验证属性,该属性获取要传入的字符串数组:
public class ValidateAtLeastOneChecked : ValidationAttribute {
public string[] CheckBoxFields {get; set;}
public ValidateAtLeastOneChecked(string[] checkBoxFields) {
CheckBoxFields = checkBoxFields;
}
protected override ValidationResult IsValid(Object value, ValidationContext context) {
Object instance = context.ObjectInstance;
Type type = instance.GetType();
foreach(string s in CheckBoxFields) {
Object propertyValue = type.GetProperty(s).GetValue(instance, null);
if (bool.Parse(propertyValue.ToString())) {
return ValidationResult.Success;
}
}
return new ValidationResult(base.ErrorMessageString);
}
}
然后我像这样使用它(我使用资源文件来本地化我的错误消息):
[ValidateAtLeastOneChecked(new string[] { "Checkbox1", "Checkbox2", "Checkbox3", "Checkbox4" }, ErrorMessageResourceType=typeof(ErrorMessageResources),ErrorMessageResourceName="SelectAtLeastOneTopic")]
public bool Checkbox1{ get; set; }
public bool Checkbox2{ get; set; }
public bool Checkbox3{ get; set; }
public bool Checkbox4{ get; set; }
它实际上只是在第一个复选框上设置错误。如果您使用内置的css突出显示突出显示错误字段,您需要稍微修改它以使其看起来正确,但我觉得这是一个可重用的干净解决方案,并允许我利用对资源文件的支持在验证属性中。