Asp.net MVC RegularExpression Validator,其错误消息取决于Model中的另一个属性

时间:2014-11-28 05:36:47

标签: asp.net-mvc

我有一个double类型的模型属性,允许两个小数点,我使用了以下属性来确保这个

[RegularExpression(RegularExpressionHelper.PositiveTwoDecimalNumberExpression, ErrorMessage = "Invalid Account balance")]
public double AccountBalance { get; set; }

还有另一个模型属性,

public bool IsSavingsAccount { get; set; }

现在我需要的行为是,当IsSavingsAccount为真时,无效账户余额的消息应为"无效的储蓄账户余额"否则它应该是"无效的当前账户余额"。其他属性类型碰巧是布尔值,但它可能是任何东西,所以我正在寻找一个可以容纳这个的解决方案。

是否有必要编写自定义验证器来实现此目的?如果是的话怎么办呢?

1 个答案:

答案 0 :(得分:1)

创建一个继承自RegularExpressionAttribute的自定义验证属性,并使用验证上下文检查其他属性:

using System.ComponentModel.DataAnnotations;

public class PositiveTwoDecimalAttribute : RegularExpressionAttribute
{
    public PositiveTwoDecimalAttribute() : base(RegularExpressionHelper.PositiveTwoDecimalNumberExpression) { }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {

        bool isSavingsAccount = (bool)validationContext.ObjectType.GetProperty("IsSavingsAccount").GetValue(validationContext.ObjectInstance, null);
        var errorMessage = isSavingsAccount ? "Invalid Savings Account balance" : "Invalid Current balance";

        if(!base.IsValid(value)){
            return new ValidationResult(errorMessage);
        }
        return ValidationResult.Success;

    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new BalanceAmountModelClientValidationRegexRule(this.ErrorMessage, RegularExpressionHelper.PositiveTwoDecimalNumberExpression);
    }
}

 public class BalanceAmountModelClientValidationRegexRule: ModelClientValidationRegexRule
 {

    public BalanceAmountModelClientValidationRegexRule(string errorMessage, string pattern)
        : base(errorMessage, pattern)
    {
    }
}