2017-07-09 661 views
1

我做了這驗證電子郵件是否已存在於我的數據庫這樣的自定義數據註解屬性屬性:自定義數據註釋驗證與客戶端驗證

[ValidateEmail(ErrorMessage = "Email exists")] 
     [Required(ErrorMessage = "Required")] 
     [RegularExpression(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", ErrorMessage = "Invalid Email")] 
     public string Email { get; set; } 

這工作完全當頁面重新加載......但我現在想改變這種做法,我啓用客戶端驗證和消息顯示無需重新加載頁面本身...

我怎麼能修改此驗證屬性,使之與.NET MVC jQuery的unobstrusive驗證compliable?

基於@薩揚的鏈接,我已經實現了這樣的事情:

public class ValidateEmail : ValidationAttribute, IClientValidatable 
    { 
     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      var rule = new ModelClientValidationRule(); 
      rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
      rule.ValidationType = "emailvalidate"; 

      yield return rule; 

     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      using (var ctx = new myContext()) 
      { 
       if (value != null) 
       { 
        var valueAsString = value.ToString().ToLower(); 
        IEnumerable<string> email = ctx.Users.Where(x => x.Email != null).Select(x => x.Email); 
        if (email.Contains(valueAsString)) 
        { 
         var errorMessage = FormatErrorMessage(validationContext.DisplayName); 
         return new ValidationResult(errorMessage); 
        } 
       } 
       return ValidationResult.Success; 
      } 
     } 
    } 

和客戶端:

$.validator.addMethod("emailvalidate", function (value, element) { 
{ 
    console.log("value: " + value + " " + element); 
}}); 
$.validator.unobtrusive.adapters.add("emailvalidate", function (options) { 

     //adding rules for validator 
    options.rules["emailvalidate"] = true; 
    if (options.message) { 
     options.messages["emailvalidate"] = options.message; 
    } 

}); 

但是,不管我在電子郵件字段現在插入電子郵件,如:

[email protected] 

我收到電子郵件存在的錯誤?

+0

任何人? =) – User987

+0

如果要調用服務器方法,請使用'[Remote]'屬性。不要把數據庫調用了'ValidationAttribute' –

回答

1

您可以在您的ValidateEmail驗證屬性中執行IClientValidatable以向客戶端提供data-val-xxx屬性。

然後,您可以使用HTML中呈現的data-val-xxx來編寫jQuery unobtrusive驗證器和適配器,以驗證客戶端的字段值。

確保基於字段值是否分別是有效還是無效的jQuery的驗證返回true(truthy值)或false(falsy值)。

最後,包括這個定製的jQuery驗證腳本到您的視圖。

你可以找到更多的細節here。雖然這篇博文提出了一個稍微複雜的場景,但看到如何使用IClientValidatable以及如何編寫jQuery不顯眼的驗證器就足夠了。

希望這是有幫助的。

+0

嘿薩彥感謝了很多的答覆。我已經實現了它的「部分」,但它總是顯示電子郵件存在......我將編輯我的解決方案最初的問題的錯誤信息我寫了,你能看看嗎? – User987

+0

我已經編輯我最初的問題 – User987

+0

我覺得我缺少的只是一些零碎拼圖完成這個。但我只是沒有看到吧XD – User987