2011-12-07 34 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)); 

我希望有帮助。

相关问题