我有一个double类型的模型属性,允许两个小数点,我使用了以下属性来确保这个
[RegularExpression(RegularExpressionHelper.PositiveTwoDecimalNumberExpression, ErrorMessage = "Invalid Account balance")]
public double AccountBalance { get; set; }
还有另一个模型属性,
public bool IsSavingsAccount { get; set; }
现在我需要的行为是,当IsSavingsAccount为真时,无效账户余额的消息应为"无效的储蓄账户余额"否则它应该是"无效的当前账户余额"。其他属性类型碰巧是布尔值,但它可能是任何东西,所以我正在寻找一个可以容纳这个的解决方案。
是否有必要编写自定义验证器来实现此目的?如果是的话怎么办呢?
答案 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)
{
}
}