2013-07-22 37 views
6

我有单选按钮对(是/否)的列表:如何根据多个条件制作所需的财产?

Q1.(Y)(N) 
Q2.(Y)(N) 
Q3.(Y)(N) 
Q4.(Y)(N) 

,我有一个属性在我的模型 public string MedicalExplanation { get; set; }

我的目标是让如果需要解释的任何无线电按钮已被设置为true。

我的第一次尝试是使用[Required],但它不处理条件。

然后,我决定使用第三方工具,如MVC万全验证 我用这样的: [RequiredIf("Q1", true, ErrorMessage = "You must explain any \"Yes\" answers!")]

现在的问题是我不知道如何使它如果需要任何其他Q2的, Q3,Q4被检查。

请指点

回答

15

在您的视图模型,创建一个布尔属性格式是这样的:

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

然后,用你的RequiredIf属性是这样的:

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

UPDATE:

如果您的Q1 - Q4房产属于bool?类型,只需更改在IsMedicalExplanationRequired属性象下面这样:

public bool IsMedicalExplanationRequired 
{ 
    get 
    { 
     return Q1.GetValueOrDefault() || Q2.GetValueOrDefault() || Q3.GetValueOrDefault() || Q4.GetValueOrDefault(); 
    } 
} 
+0

在我的应用程序Q1,Q2,Q3,Q4是布尔值(是或否),所以我得到错误'Operator'||'不能应用于'bool'类型的操作数? ' – meda

+0

查看已更新的答案。 – ataravati

+0

太棒了!你是最好的 !哈哈! – meda

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

+0

这是一个不错的方法,我会尝试当我有机会+1 – meda