【问题标题】:Custom validation code is not triggered immediately after leaving focus离开焦点后不会立即触发自定义验证码
【发布时间】:2016-02-29 18:27:13
【问题描述】:

对于我的asp.net MVC View,我使用了验证注释和自定义验证器来验证我的字段。

在我的ViewModel

为了测试,我使用了

[StringLength(16, MinimumLength = 8, ErrorMessage = "This is a test to check if validation appears after leaving textbox")]
[Display(Name = "Requestor First Name")]
[Required]
public string RequestorFirstName { get; set; }

在视图中,当我只键入一个字母并离开文本框焦点时,出现字符串长度的错误消息。我知道 客户端验证正在运行。

对于我的自定义验证器:

[FaceAmount]
public decimal CurrentFaceAmount { get; set; }

当我在CurrentFaceAmount 字段中更改美元金额时,IMMEDIATELY 不会触发自定义验证码。仅有的 点击提交按钮后,断点在以下代码中:

public class FaceAmount : ValidationAttribute, IClientValidatable
{
    private string _dependentProperty;

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            decimal val;
            var isNumeric = decimal.TryParse(value.ToString(), out val);

            if (isNumeric)
            {
                if (val > 0 && val < 100000)
                {
                    return new ValidationResult("Minimum Coverage Amount is $1000.00");
                }
            }
        }

        return ValidationResult.Success;
    }
}

离开文本框焦点后如何触发此自定义验证代码?

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    您必须添加一个如下所示的客户端验证器,由Ode to Code 提供:

    jQuery.validator.unobtrusive
          .adapters.addSingleVal("greaterdate", "other");
    
    jQuery.validator.addMethod("greaterdate",
        function (val, element, other) {
            var modelPrefix = element.name.substr(
                                0, element.name.lastIndexOf(".") + 1)
            var otherVal = $("[name=" + modelPrefix + other + "]").val();
            if (val && otherVal) {
                if (Date.parse(val) <= Date.parse(otherVal)) {
                    return false;
                }
            }
            return true;
        }
    );
    

    并使用 IClientValidatable 链接到它:

    public class DateGreaterThanAttribute : 
                        ValidationAttribute, 
                        IClientValidatable 
    {
    
        public IEnumerable<ModelClientValidationRule>
            GetClientValidationRules(ModelMetadata metadata,
                                     ControllerContext context)
        {
            var rule = new ModelClientValidationRule();
            rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
            rule.ValidationParameters.Add("other", OtherProperty);
            rule.ValidationType = "greaterdate";
            yield return rule;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      相关资源
      最近更新 更多