2011-12-07 38 views
4

如何設置屬性上的最小和最大註釋以及數據註釋擴展?如何使用數據註釋擴展在屬性上設置最小和最大註釋?

這是我曾嘗試:

[Required(ErrorMessage = "Dette felt er påkrævet!")] 
     [Digits(ErrorMessage = "Indtast kun cifre")] 
     [Min(8, ErrorMessage = "Brugernavnet skal være 8 tegn langt.")] 
     [Max(8, ErrorMessage = "Brugernavnet skal være 8 tegn langt.")] 
     [Display(Name = "Brugernavn")] 
     public string UserName { get; set; } 

我得到以下錯誤:

在不顯眼的客戶端驗證規則驗證類型名稱必須是唯一的。以下驗證類型不止一次出現:範圍

回答

7

最小值和最大值用於十進制類型。對於字符串使用[StringLength][RegularExpression]屬性:

[StringLength(8, MinimumLength = 8)] 
public string UserName { get; set; } 
2

我有同樣的問題,因爲Kenci。我想同時使用[Min]和[Max],所以我可以爲每種類型的錯誤而不是範圍提供單獨的錯誤消息。我也遇到過......

Validation type names in unobtrusive client validation rules must be unique. The 
following validation type was seen more than once: range 

因爲他們決定爲這兩種類型使用相同的驗證名稱!

我通過保持最小值和創建我自己的Int Max來解決這個問題。

添加這個類的地方,最好是在一個CustomerValidation類

public class MaximumDecimalCheck : ValidationAttribute, IClientValidatable 
    { 
     private readonly int _max; 
     private readonly string _defaultErrorMessage = ""; 
     public MaximumDecimalCheck(int max, string defaultErrorMessage) 
      : base(defaultErrorMessage) 
     { 
      _max = max; 
      _defaultErrorMessage = defaultErrorMessage.Replace("{0}", _max.ToString()); 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (value == null) 
       return null; 

      int intValue; 
      bool parsedDecimal = int.TryParse(value.ToString(), out intValue); 
      if (parsedDecimal) 
      { 
       if (intValue < _max) 
       { 
        return ValidationResult.Success; 
       } 
      } 
      return new ValidationResult(_defaultErrorMessage); 
     } 

     public override string FormatErrorMessage(string name) 
     { 
      return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, _max); 
     } 

     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      var modelClientValidationRule = new ModelClientValidationRule(); 
      modelClientValidationRule.ValidationType = "checkmaxint"; 
      modelClientValidationRule.ErrorMessage = _defaultErrorMessage; 
      modelClientValidationRule.ValidationParameters.Add("maxint", _max.ToString()); 

      return new List<ModelClientValidationRule> { modelClientValidationRule }; 
     } 
    } 

然後,在你的模型對象,

[Required(ErrorMessage = "Monthly income (after tax) required")] 
    [DataType(DataType.Currency)] 
    [Display(Name = "Monthly income (after tax)")] 
    [Min(200, ErrorMessage = "You do not earn enough")] 
    [MaximumDecimalCheck(10000, "You earn to much a month")] 
    public decimal? MonthlyIncomeAfterTax { get; set; } 

屬性類型可以是十進制,詮釋等等......但是它會只把它解析爲一個int。

我未能創建一個小數位的靜態類型,所以很快投入,如果有人可以回答這個問題,我會很高興。

添加符號後,引用下面的JavaScript。

(function ($) { 

    /* 
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT 
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT 
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT 
    */ 
    jQuery.validator.unobtrusive.adapters.add("checkmaxint", ['maxint'], function (options) { 
     options.rules["checkmaxint"] = options.params; 
     options.messages["checkmaxint"] = options.message; 
    }); 

    jQuery.validator.addMethod("checkmaxint", function (value, element, params) { 
     var maxValue = params.maxint; 
     var inputValue = value; 

     var parsedInt = parseInt(inputValue); 
     if (isNaN(parsedInt)) { 
      return false; 
     } 
     else if (parsedInt > maxValue) { 
      return false; 
     } 
     else { 
      return true; 
     } 
    }); 
    /* 
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT 
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT 
    START CHECK MAX INT - UNOBTRUSIVE JAVASCRIPT 
    */ 



} (jQuery)); 

我希望有幫助。

相關問題