2011-12-12 80 views
0

我正在使用jQuery的不顯眼的方法驗證我的模型在UI中。我在模型中有一個數字字段,我想驗證它是一個數字。開箱即用,它幾乎可以正常工作。它在驗證.33與0.33時在客戶端失敗。我知道我可以在jQuery驗證插件中更改正則表達式,但這似乎並不理想。MVC模型驗證不顯眼

因此,要嘗試解決問題,而改裝的插件本身,我創建了以下驗證屬性:

public class DecimalValidator : System.ComponentModel.DataAnnotations.ValidationAttribute, System.Web.Mvc.IClientValidatable 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     decimal val = 0; 
     ValidationResult ret = new ValidationResult("Must be a valid decimal"); 

     if (decimal.TryParse(value.ToString(), out val)) 
      return ValidationResult.Success; 
     else 
      return ret; 
    } 


    #region IClientValidatable Members 

    public System.Collections.Generic.IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(System.Web.Mvc.ModelMetadata metadata, System.Web.Mvc.ControllerContext context) 
    { 
     List<System.Web.Mvc.ModelClientValidationRule> ret = new List<System.Web.Mvc.ModelClientValidationRule>(); 

     System.Web.Mvc.ModelClientValidationRule validDecimalRule = new System.Web.Mvc.ModelClientValidationRule 
     { 
      ErrorMessage = "Please enter a valid decimal.", 
      ValidationType = "decimal" 
     }; 

     ret.Add(validDecimalRule); 

     return ret; 
    } 

    #endregion 
} 

並將其應用像這樣:

/// <summary> 
    /// The price per unit. 
    /// </summary> 
    [Range(0, double.MaxValue)] 
    [Display(Name = "Price")] 
    [DecimalValidator] 
    public decimal UnitPrice { get; set; } 

的問題是, html仍呈現 data-val-number =「字段價格必須是一個數字。」 除新數據外, data-val-decimal =「請輸入有效的小數。」

如何保持默認驗證屬性不被渲染?

回答

0

我相信[Range(0, double.MaxValue)]迫使它加載數字驗證。 嘗試將其添加到您的自定義驗證器中,並將其從字段修飾器中移除。

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    decimal val = 0; 
    ValidationResult ret = new ValidationResult("Must be a valid decimal"); 
    ValidationResult rangeRet = new ValidationResult(String.Format("Number must be between 0 and {0}", double.MaxValue.ToString()); 

    if (decimal.TryParse(value.ToString(), out val)) 
     return ValidationResult.Success; 
    else if (value < 0 || value > double.MaxValue) 
     return rangeRet; 
    else 
     return ret; 
} 
+0

沒有正則表達式替換數字驗證的插件,它是不是範圍驗證兩種。 – Darthg8r

-1

爲什麼要創建自定義驗證器? MVC將默認爲您進行驗證。如果你讓你的類型爲空(十進制?),那麼如果輸入了非十進制數,MVC將把UnitPrice設置爲null,並且如果它違反了你正在做的任何其他驗證,那麼你的模型狀態將變爲無效。

+0

他在他的問題中說:爲什麼:「開箱即用,它幾乎可以正常工作,在驗證.33與0.33時在客戶端失敗。」 – Terry

+0

@TerryR - 但事實並非如此,默認的模型綁定器將解析.33就好,所以他一定是在談論別的東西。 –

+0

雅我沒有證實,我只是提供了一個基於他所要求的解決方案。至少他現在有兩條不同的路徑... – Terry

0

我找到了答案,是使用$ .extend與允許0.33和0.33

+0

我仍然很想知道是什麼導致驗證規則甚至出現在客戶端上,如果你拿出'Range'裝飾器。雖然我並沒有真正嘗試使用不顯眼的驗證插件,只有jQuery驗證插件。 – Terry

相關問題