2016-02-29 67 views
0

對於我的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; } 

在視圖中,當我輸入只是一個字母,離開文本框的焦點,出現stringlength的錯誤消息。我知道 客戶端驗證正在工作。

對於我自定義的驗證:

[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; 
    } 
} 

我怎麼能離開火的文本框焦點後這個自定義的驗證碼?

回答

1

你有一個客戶端驗證器看起來像這樣的Ode to Code禮貌補充:使用IClientValidatable

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; 
    } 
); 

,並鏈接到它:

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; 
    } 
相關問題