Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Asp.net MVC RegularExpression验证程序,其错误消息依赖于模型中的另一个属性_Asp.net Mvc - Fatal编程技术网

Asp.net mvc Asp.net MVC RegularExpression验证程序,其错误消息依赖于模型中的另一个属性

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

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

[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不引人注目的客户端位