如何根据多种条件制作所需的房产?

时间:2013-07-22 19:20:55

标签: asp.net-mvc validation requiredfieldvalidator

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

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,我不知道怎么做。

请咨询

2 个答案:

答案 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突出显示突出显示错误字段,您需要稍微修改它以使其看起来正确,但我觉得这是一个可重用的干净解决方案,并允许我利用对资源文件的支持在验证属性中。

相关问题