Asp.net mvc Asp.net MVC RegularExpression验证程序,其错误消息依赖于模型中的另一个属性
我有一个double类型的model属性,允许使用两个小数点,我使用了以下属性来确保这一点Asp.net mvc Asp.net MVC RegularExpression验证程序,其错误消息依赖于模型中的另一个属性,asp.net-mvc,Asp.net Mvc,我有一个double类型的model属性,允许使用两个小数点,我使用了以下属性来确保这一点 [RegularExpression(RegularExpressionHelper.PositiveTwoDecimalNumberExpression, ErrorMessage = "Invalid Account balance")] public double AccountBalance { get; set; } 还有一个模型属性是 public bool IsSavingsAccount
[RegularExpression(RegularExpressionHelper.PositiveTwoDecimalNumberExpression, ErrorMessage = "Invalid Account balance")]
public double AccountBalance { get; set; }
还有一个模型属性是
public bool IsSavingsAccount { get; set; }
现在,我需要的行为是当任何IsSavesAccount为真时,无效帐户余额的消息应为“无效储蓄帐户余额”,否则应为“无效活期帐户余额”。另一个属性类型在这里正好是布尔值,但它可以是任何值,因此我正在寻找一个解决方案来适应此情况
是否有必要编写自定义验证器来实现这一点?如果是,如何执行?创建一个从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)
{
}
}
使用System.ComponentModel.DataAnnotations;
公共类PositiveNetModeCimalAttribute:RegularExpressionAttribute
{
public PositiveWebodeCimalAttribute():基(RegularExpressionHelper.PositiveWebodeCimalNumberExpression){}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
bool isSavingsAccount=(bool)validationContext.ObjectType.GetProperty(“isSavingsAccount”).GetValue(validationContext.ObjectInstance,null);
var errorMessage=IsSavesAccount?“无效的储蓄账户余额”:“无效的当前余额”;
如果(!base.IsValid(值)){
返回新的ValidationResult(errorMessage);
}
返回ValidationResult.Success;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
返回新的BalanceAmountModelClientValidationRegexRule(this.ErrorMessage,RegularExpressionHelper.PositiveModelCimalNumberPression);
}
}
公共类BalanceAmountModelClientValidationRegexRule:ModelClientValidationRegexRule
{
public BalanceAmountModelClientValidationRegexRule(字符串错误消息,字符串模式)
:base(错误消息、模式)
{
}
}
有许多验证属性,如[RequiredIfTrue]
,这些属性应该适合您的需要。此时此刻,我想使用开箱即用的验证,或者自己编写一些东西,因为这是我唯一的特例,所以从您的评论来看,定制验证程序似乎就是这样的方式吗?是的,您可以编写自己的属性。您从ValidationAttribute
派生并实现IClientValidable
,然后为$.validator.addMethod
和$.validator.unobtrusive.adapters.编写脚本。添加方法感谢答案,我会检查这一点,但在我做之前,另一个问题是,我需要实现IClientValidable以使其在客户端工作吗?是的,我想是的,您可以在global.asax app start中注册它。我也相信。编辑上述解决方案以添加帮助解决问题的代码,请注意,我不必在客户端执行任何操作(即创建一个客户端函数和适配器)我只是重用了现有的regex不引人注目的客户端位