2013-10-31 53 views
1

我想讓客戶端驗證與我的自定義數據註解一起工作,我面臨的問題是,每當我有一個非必需的實體並提交我的請求(離開NON - 必填字段空白),我的代碼的客戶端部分踢進來,並嘗試驗證空白!我怎樣才能避免這種情況? 含義,如果用戶沒有輸入任何內容,那麼不要驗證?自定義數據註釋 - 客戶端驗證

謝謝!

客戶端代碼:

$.validator.addMethod("emailvalid", function (value, element, params) { 
var regex = /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/; 
return regex.test(value); 
}); 
$.validator.unobtrusive.adapters.addBool("emailvalid"); 

服務器端代碼:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class EmailValidAttribute : ValidationAttribute, IClientValidatable 
{ 
    private Regex Regex { get; set; } 
    private string pattern { 
     get { 
      return @"^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$"; 
     } 
    } 

    public EmailValidAttribute(string errorMessage) 
     : base(errorMessage) 
    { 
     this.Regex = new Regex(this.pattern); 
    } 

    public override bool IsValid(object value) 
    { 
     var stringValue = Convert.ToString(value); 

     // automatically pass if value is null or empty. RequiredAttribute should be used to assert an empty value 
     if (string.IsNullOrWhiteSpace(stringValue)) 
     { 
      return true; 
     } 

     var m = Regex.Match(stringValue); 

     // looking for an exact match, not just a search hit 
     return (m.Success && (m.Index == 0) && (m.Length == stringValue.Length)); 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule(); 
     rule.ValidationType = "emailvalid"; 
     rule.ErrorMessage = ErrorMessageString; 

     yield return rule; 
    } 
} 

回答

2

難道你只是在測試正則表達式之前執行一個簡單的驗證嗎? $ .trim()方法是忽略尾隨空格(假設你正在使用jQuery)。 類似於

$.validator.addMethod("emailvalid", function (value, element, params) { 
    if ($.trim(value) == '') return true; 

    var regex = /^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([a-zA-Z0-9]{1}[a-zA-Z0-9\-]{0,62}[a-zA-Z0-9]{1})|[a-zA-Z])\.)+[a-zA-Z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/; 
    return regex.test(value); 
}); 
+0

完全忘記了這樣一個真棒功能,修剪!謝謝你,完美的作品:) – Jose

+1

如果你的目標用戶滿足瀏覽器要求(IE9 +),你可以使用內建的'String.trim()'函數。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim – Vache

1

添加指定的輸入不需要的規則。

見jQuery驗證文檔瞭解更多信息:http://jqueryvalidation.org/rules

你有這樣的事情:

$("#myinput").rules("add", { 
    required: false 
}); 

您也可以在您的驗證返回true如果輸入的是空白,但因爲你」您已經使用驗證API,您可能會使用其內置功能。

+0

您正在使用jquery選擇器,這將如何轉換爲我的代碼?我不希望它只與一個元素緊密耦合,但我想要爲所有類型爲email的所有實體定義規則 '' – Jose

+1

說「空字符串是一個有效的電子郵件地址」郵件「和」空字符串不是有效的電子郵件,但這個字段不是必需的「。我更願意將這兩個概念分開,但如果你永遠不會需要電子郵件,我認爲確實將它包含在驗證中會更容易。 – Vache

+0

我明白你的意思了。是否有可能使用$ .validator ...來定義這樣的規則? – Jose

相關問題