8

我有一对单选按钮列表(是/否):

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 中的任何一个,我不知道如何使其成为必需。

请指教

4

2 回答 2

17

在您的 ViewModel 中,创建一个 bool 属性,如下所示:

public bool IsMedicalExplanationRequired
{
   get
   {
       return Q1 || Q2 || Q3 || Q4;
   }
}

然后,RequiredIf像这样使用您的属性:

[RequiredIf("IsMedicalExplanationRequired", true, ErrorMessage = "You must explain any \"Yes\" answers!")]

更新:

如果您的 Q1 - Q4 属性是 type bool?,只需更改IsMedicalExplanationRequired属性如下:

public bool IsMedicalExplanationRequired
{
   get
   {
       return Q1.GetValueOrDefault() || Q2.GetValueOrDefault() || Q3.GetValueOrDefault() || Q4.GetValueOrDefault();
   }
}
于 2013-07-22T19:30:58.523 回答
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 突出显示来突出显示错误的字段,您需要稍微修改一下以使其看起来正确,但我觉得这是一个干净的解决方案,可重复使用,并允许我利用对资源文件的支持在验证属性中。

于 2014-12-09T17:21:28.620 回答